代码
module mod_tools
implicit none
integer,parameter :: its = 1
integer,parameter :: ite = 4
integer,parameter :: jts = 1
integer,parameter :: jte = 3
integer,parameter :: kms = 1
integer,parameter :: kme = 2
interface test_optional
module procedure test_optional_integer_1d
module procedure test_optional_integer_2d
module procedure test_optional_integer_3d
module procedure test_optional_real_1d
module procedure test_optional_real_2d
module procedure test_optional_real_3d
end interface ! test_optional
contains
subroutine test_optional_real_1d(var1,var2)
! ---------------------------------------
! var2是可选参数;
! optional属性表示这个参数是可选的;
! 用present来判断是否传入可选参数;
! ---------------------------------------
implicit none
real,dimension(its:ite),intent(in) :: var1
real,dimension(its:ite),optional,intent(in) :: var2
print*,"var1=",var1
if(present(var2)) then
print*,"var2=",var2
end if
print*," "
end subroutine test_optional_real_1d
subroutine test_optional_real_2d(var1,var2)
implicit none
real,dimension(its:ite,jts:jte),intent(in) :: var1
real,dimension(its:ite,jts:jte),optional,intent(in) :: var2
print*,"var1=",var1
if(present(var2)) then
print*,"var2=",var2
end if
print*," "
end subroutine test_optional_real_2d
subroutine test_optional_real_3d(var1,var2)
implicit none
real,dimension(its:ite,jts:jte,kms:kme),intent(in) :: var1
real,dimension(its:ite,jts:jte,kms:kme),optional,intent(in) :: var2
print*,"var1=",var1
if(present(var2)) then
print*,"var2=",var2
end if
print*," "
end subroutine test_optional_real_3d
subroutine test_optional_integer_1d(var1,var2)
implicit none
integer,dimension(its:ite),intent(in) :: var1
integer,dimension(its:ite),optional,intent(in) :: var2
print*,"var1=",var1
if(present(var2)) then
print*,"var2=",var2
end if
print*," "
end subroutine test_optional_integer_1d
subroutine test_optional_integer_2d(var1,var2)
implicit none
integer,dimension(its:ite,jts:jte),intent(in) :: var1
integer,dimension(its:ite,jts:jte),optional,intent(in) :: var2
print*,"var1=",var1
if(present(var2)) then
print*,"var2=",var2
end if
print*," "
end subroutine test_optional_integer_2d
subroutine test_optional_integer_3d(var1,var2)
implicit none
integer,dimension(its:ite,jts:jte,kms:kme),intent(in) :: var1
integer,dimension(its:ite,jts:jte,kms:kme),optional,intent(in) :: var2
print*,"var1=",var1
if(present(var2)) then
print*,"var2=",var2
end if
print*," "
end subroutine test_optional_integer_3d
END module mod_tools
program Main
use mod_tools
implicit none
integer,dimension(its:ite) :: int_1d_1,int_1d_2
integer,dimension(its:ite,jts:jte) :: int_2d_1,int_2d_2
integer,dimension(its:ite,jts:jte,kms:kme) :: int_3d_1,int_3d_2
real ,dimension(its:ite) :: real_1d_1,real_1d_2
real ,dimension(its:ite,jts:jte) :: real_2d_1,real_2d_2
real ,dimension(its:ite,jts:jte,kms:kme) :: real_3d_1,real_3d_2
int_1d_1 = 1
int_1d_2 = 2
int_2d_1 = 3
int_2d_2 = 4
int_3d_1 = 5
int_3d_2 = 6
real_1d_1 = 1.5
real_1d_2 = 2.5
real_2d_1 = 3.5
real_2d_2 = 4.5
real_3d_1 = 5.5
real_3d_2 = 6.5
call test_optional(int_1d_1,int_1d_2)
call test_optional(int_2d_1,int_2d_2)
call test_optional(int_3d_1,int_3d_2)
call test_optional(real_1d_1,real_1d_2)
call test_optional(real_2d_1,real_2d_2)
call test_optional(real_3d_1,real_3d_2)
end program Main
结果
var1= 1 1 1 1
var2= 2 2 2 2
var1= 3 3 3 3 3 3 3 3 3 3 3 3
var2= 4 4 4 4 4 4 4 4 4 4 4 4
var1= 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
var2= 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
var1= 1.50000000 1.50000000 1.50000000 1.50000000
var2= 2.50000000 2.50000000 2.50000000 2.50000000
var1= 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000 3.50000000
var2= 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000 4.50000000
var1= 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000 5.50000000
var2= 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000 6.50000000