函数:SIGN(A,B)
Description:
SIGN(A,B)
returns the value of
A with the sign of
B.
RESULT = SIGN(A, B)
A | Shall be of type INTEGER or REAL |
B | Shall be of the same type and kind as A |
print *,sign(1,-8)
print *,sign(9,-5)
print *,sign(-3,2)
输出分别为-1,-9,3
MAXLOC
— Location of the maximum value within an array
Description:
-
Determines the location of the element in the array with the maximum value, or, if the
DIM argument is supplied, determines the locations of the maximum element along each row of the array in the
DIM direction. If
MASK is present, only the elements for which
MASK is
.TRUE.
are considered. If more than one element in the array has the maximum value, the location returned is that of the first such element in array element order. If the array has zero size, or all of the elements of MASK are.FALSE.
, then the result is an array of zeroes. Similarly, if DIM is supplied and all of the elements of MASK along a given row are zero, the result value for that row is zero.
Standard:
-
Fortran 95 and later
Class:
-
Transformational function
Syntax:
-
RESULT = MAXLOC(ARRAY, DIM [, MASK])
RESULT = MAXLOC(ARRAY [, MASK])
Arguments:
-
ARRAY Shall be an array of type INTEGER
orREAL
.DIM (Optional) Shall be a scalar of type INTEGER
, with a value between one and the rank of ARRAY, inclusive. It may not be an optional dummy argument.MASK Shall be an array of type LOGICAL
, and conformable with ARRAY.
Return value:
-
If
DIM is absent, the result is a rank-one array with a length equal to the rank of
ARRAY. If
DIM is present, the result is an array with a rank one less than the rank of
ARRAY, and a size corresponding to the size of
ARRAY with the
DIM dimension removed. If
DIM is present and
ARRAY has a rank of one, the result is a scalar. In all cases, the result is of default
INTEGER
type.
program main
implicit none
integer ::i,j
integer,dimension(2) ::pos
integer,dimension(2:4,3:6) ::arr
data((arr(i,j),i=2,4),j=3,6)/1,3,4,5,6,7,8,9,10,25,76,89/
pos=maxloc(arr)
write(*,*)'i=',pos(1),'j=',pos(2)
pos=minloc(arr)
write(*,*)'i=',pos(1),'j=',pos(2)
end
程序输出为
i= 3 j= 4
i= 1 j= 1
输出的最大值的位置为相对于第一个元素的位置,是相对位置,而不是该元素的实际索引
比如第一个元素的位置是(2,3) maxloc对应元素的实际位置需(3,4)+(2,3)-(1,1)=(4,6)
minloc函数也相同
EQUIVALENCE
equivalence表达式The EQUIVALENCE statement specifies that two or more variables or arrays in a program unit share the same memory.
EQUIVALENCE (nlist) [, (nlist)] ...
Parameter | Description |
nlist | List of variable names, array element names, array names, and character substring names separated by commas |
An EQUIVALENCE statement stipulates that the storage sequence of the entities whose names appear in the list nlist must have the same first memory location.
EQUIVALENCE语句规定了名字出现在nlist中的实体的存储序列必须具有相同的首个内存位置
An array name, if present, refers to the first element of the array.
如果数组名出现在参数中,那么它代表数组的第一个元素
program main
implicit none
integer,dimension(2) ::arr
integer ::i
equivalence(i,arr(1))
arr(1)=5
write(*,*) i !输出5
i=100
write(*,*) arr(1) !输出100
end
equivalence语句有点像C++的引用,equivalence的参数中的变量指向了内存中的同一个位置,修改其中一个参数,其他参数的值也就跟着改变
获取cpu的时间,可以用于测试某段代码所花的时间
cite from http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gfortran/CPU_005fTIME.html
7.34 CPU_TIME
— CPU elapsed time in seconds
-
Description:
-
Returns a
REAL
value representing the elapsed CPU time in seconds. This is useful for testing segments of code to determine execution time.
Option:
-
f95, gnu
Class:
-
subroutine
Syntax:
-
CPU_TIME(X)
Arguments:
-
X The type shall be REAL
with intent out.
Return value:
-
None
Example:
-
program test_cpu_time real :: start, finish call cpu_time(start) ! put code to test here call cpu_time(finish) print '("Time = ",f6.3," seconds.")',finish-start end program test_cpu_time
13. Common blocks -f77 common block
Fortran 77 has no global variables, i.e. variables that are shared among several program units (subroutines). The only way to pass information between subroutines we have seen so far is to use the subroutine parameter list. Sometimes this is inconvenient, e.g., when many subroutines share a large set of parameters. In such cases one can use a common block. This is a way to specify that certain variables should be shared among certain subroutines. But in general, the use of common blocks should be minimized.
Syntax
common / name / list-of-variables
Example
Suppose you have two parameters alpha and beta that many of your subroutines need. The following example shows how it can be done using common blocks.
program main some declarations real alpha, beta common /coeff/ alpha, beta statements stop end subroutine sub1 (some arguments) declarations of arguments real alpha, beta common /coeff/ alpha, beta statements return end subroutine sub2 (some arguments) declarations of arguments real alpha, beta common /coeff/ alpha, beta statements return end
- The common statement should appear together with the variable declarations, before the executable statements.
- Different common blocks must have different names (just like variables).
- A variable cannot belong to more than one common block.
- The variables in a common block do not need to have the same names each place they occur (although it is a good idea to do so), but they must be listed in the same order and have the same type and size.
common block中的变量不需要在每一次出现的时候使用相同的变量名(尽管用相同变量名比较好),但是他们必须被以同样的顺序排列,具有相同的类型与大小
To illustrate this, look at the following continuation of our example:
subroutine sub3 (some arguments) declarations of arguments real a, b common /coeff/ a, b statements return end
This declaration is equivalent to the previous version that used alpha and beta.
the following paragraph cites from f90 standard
5.5.2.1 Common block storage sequence
For each common block, a common block storage sequence is formed as follows:
(1) A storage sequence is formed consisting of the sequence of storage units contained in the storage
sequences (14.6.3.1) of all data objects in the common block object lists for the common block. The
order of the storage sequences is the same as the order of the appearance of the common block
object lists in the scoping unit.
(2) The storage sequence formed in (1) is extended to include all storage units of any storage sequence
associated with it by equivalence association. The sequence may be extended only by adding
storage units beyond the last storage unit. Data objects associated with an entity in a common block
are considered to be in that common block.
common block对象列表中的数据对象在内存中的布局是连续的,顺序与common block对象列表中出现的顺序相同
ibset
ibset将参数i的二进制表示中位置pos上的位设置为1并且返回第一个参数i的值
cite from
http://gcc.gnu.org/onlinedocs/gfortran/IBSET.html
IBSET
— Set bit
-
IBSET
returns the value of I with the bit at position POS set to one.
Standard:
-
Fortran 95 and later
Class:
-
Elemental function
Syntax:
-
RESULT = IBSET(I, POS)
Arguments:
-
I The type shall be INTEGER
.POS The type shall be INTEGER
.
Return value:
-
IBCLR
returns the value of I with the bit at position POS set to zero.
Standard:
-
Fortran 95 and later
Class:
-
Elemental function
Syntax:
-
RESULT = IBCLR(I, POS)
Arguments:
-
I The type shall be INTEGER
.POS The type shall be INTEGER
.
Return value:
-
The return value is of type
INTEGER
and of the same kind as I. -
BTEST(I,POS)
returns logical.TRUE.
if the bit at POS in I is set. The counting of the bits starts at 0.
Standard:
-
Fortran 95 and later
Class:
-
Elemental function
Syntax:
-
RESULT = BTEST(I, POS)
Arguments:
-
I The type shall be INTEGER
.POS The type shall be INTEGER
.
Return value:
-
The return value is of type
LOGICAL
-
ISHFT
returns a value corresponding to I with all of the bits shifted SHIFT places. A value of SHIFT greater than zero corresponds to a left shift, a value of zero corresponds to no shift, and a value less than zero corresponds to a right shift. If the absolute value of SHIFT is greater thanBIT_SIZE(I)
, the value is undefined. Bits shifted out from the left end or right end are lost; zeros are shifted in from the opposite end.
Standard:
-
Fortran 95 and later
Class:
-
Elemental function
Syntax:
-
RESULT = ISHFT(I, SHIFT)
Arguments:
-
I The type shall be INTEGER
.SHIFT The type shall be INTEGER
.
Return value:
-
Moves
LEN bits from positions
FROMPOS through
FROMPOS+LEN-1
of FROM to positions TOPOS throughTOPOS+LEN-1
of TO. The portion of argument TO not affected by the movement of bits is unchanged. The values ofFROMPOS+LEN-1
andTOPOS+LEN-1
must be less thanBIT_SIZE(FROM)
.
Standard:
-
Fortran 95 and later
Class:
-
Elemental subroutine
Syntax:
-
CALL MVBITS(FROM, FROMPOS, LEN, TO, TOPOS)
Arguments:
-
FROM The type shall be INTEGER
.FROMPOS The type shall be INTEGER
.LEN The type shall be INTEGER
.TO The type shall be INTEGER
, of the same kind as FROM.TOPOS The type shall be INTEGER
.
8.35
BIT_SIZE
— Bit size inquiry function-
Description:
-
BIT_SIZE(I)
returns the number of bits (integer precision plus sign bit) represented by the type of I. The result ofBIT_SIZE(I)
is independent of the actual value of I.
Standard:
-
Fortran 95 and later
Class:
-
Inquiry function
Syntax:
-
RESULT = BIT_SIZE(I)
Arguments:
-
I The type shall be INTEGER
.
-
The return value is of type INTEGER
and of the same kind as I.
ibclr返回第一个参数i的值并将二进制表示中pos位上的位设为0
IBCLR
— Clear bit
-
Description:
如果参数i的二进制表示中pos位是1,函数返回true
BTEST
— Bit test function
-
Description:
ishft参数中shift>0为左移,shift等于0不移位,shift<0为右移
8.135 ISHFT
— Shift bits
-
Description:
The return value is of type INTEGER
and of the same kind as I.
8.180 MVBITS
— Move bits from one integer to another
-
Description: