24 integer(ip_intwp_p),
public :: maxvar
25 integer(kind=ip_i4_p),
parameter,
public :: mvarcpl = 10
29 character(len=ic_lvar):: name
30 integer(kind=ip_i4_p) :: part
31 integer(kind=ip_i4_p) :: ndim
32 integer(kind=ip_i4_p) :: num
33 integer(kind=ip_i4_p) :: ops
34 integer(kind=ip_i4_p) ::
type
35 integer(kind=ip_i4_p) :: size
36 integer(kind=ip_i4_p) :: ncpl
37 integer(kind=ip_i4_p) :: cpl(mvarcpl)
40 integer(kind=ip_intwp_p),
public :: prism_nvar = 0
50 id_var_nodims, kinout, id_var_shape, ktype, kinfo)
52 INTEGER(kind=ip_i4_p),
intent(out) :: id_nports
53 CHARACTER(len=*) ,
intent(in) :: cdport
54 INTEGER(kind=ip_i4_p),
intent(in) :: id_part
55 INTEGER(kind=ip_i4_p),
intent(in) :: id_var_nodims(2)
56 INTEGER(kind=ip_i4_p),
intent(in) :: kinout
57 INTEGER(kind=ip_i4_p),
intent(in) :: id_var_shape(2*id_var_nodims(1))
58 INTEGER(kind=ip_i4_p),
intent(in) :: ktype
59 INTEGER(kind=ip_i4_p),
intent(out),
optional :: kinfo
61 INTEGER(kind=ip_i4_p) :: n
62 CHARACTER(len=ic_lvar) :: trimmed_cdport
63 character(len=*),
parameter :: subname =
'(oasis_def_var)'
64 LOGICAL :: l_field_in_namcouple
68 if (.not. oasis_coupled)
then
79 if (len_trim(cdport) > ic_lvar)
then
80 WRITE(nulprt,*) subname,estr,
'variable too long = ',trim(cdport)
81 WRITE(nulprt,*) subname,estr,
'max variable length (ic_lvar) = ',ic_lvar
84 trimmed_cdport = trim(cdport)
88 l_field_in_namcouple = .false.
96 DO WHILE (n < size_namfld .AND. (.NOT.l_field_in_namcouple))
98 IF ( (trimmed_cdport == total_namsrcfld(n)).OR. &
99 (trimmed_cdport == total_namdstfld(n)) )
THEN
100 l_field_in_namcouple = .true.
108 if (.not. l_field_in_namcouple)
then
109 id_nports = oasis_var_uncpl
110 if (oasis_debug >= 2)
then
111 write(nulprt,*) subname,
' variable not in namcouple return ',trimmed_cdport
123 if (trimmed_cdport == prism_var(n)%name)
then
124 write(nulprt,*) subname,estr,
'variable already defined with def_var = ',trimmed_cdport
125 write(nulprt,*) subname,estr,
'check oasis_def_var calls in your model'
134 prism_nvar = prism_nvar + 1
135 id_nports = prism_nvar
137 if (prism_nvar > maxvar)
then
138 write(nulprt,*) subname,estr,
'prism_nvar too large = ',prism_nvar,maxvar
139 write(nulprt,*) subname,estr,
'check maxvar set in oasis_init_comp'
144 prism_var(prism_nvar)%name = trimmed_cdport
145 prism_var(prism_nvar)%part = id_part
146 prism_var(prism_nvar)%ndim = id_var_nodims(1)
147 prism_var(prism_nvar)%num = id_var_nodims(2)
148 prism_var(prism_nvar)%ops = kinout
149 prism_var(prism_nvar)%type = ktype
150 prism_var(prism_nvar)%size = 1
151 do n = 1,prism_var(prism_nvar)%ndim
152 prism_var(prism_nvar)%size = prism_var(prism_nvar)%size*(id_var_shape(2*n)-&
153 id_var_shape(2*n-1)+1)
155 prism_var(prism_nvar)%ncpl = 0
156 prism_var(prism_nvar)%cpl = 0
162 if (oasis_debug >= 2)
then
164 write(nulprt,*) subname,
' prism_nvar = ',prism_nvar
165 write(nulprt,*) subname,
' varname = ',prism_nvar,trim(prism_var(prism_nvar)%name)
166 write(nulprt,*) subname,
' varpart = ',prism_nvar,prism_var(prism_nvar)%part
167 write(nulprt,*) subname,
' varndim = ',prism_nvar,prism_var(prism_nvar)%ndim
168 write(nulprt,*) subname,
' varnum = ',prism_nvar,prism_var(prism_nvar)%num
169 write(nulprt,*) subname,
' varops = ',prism_nvar,prism_var(prism_nvar)%ops
170 write(nulprt,*) subname,
' vartype = ',prism_nvar,prism_var(prism_nvar)%type
171 write(nulprt,*) subname,
' varsize = ',prism_nvar,prism_var(prism_nvar)%size
188 integer(kind=ip_intwp_p) :: m,n,p,v
189 INTEGER(kind=ip_intwp_p) :: ierr, taskid
190 integer(kind=ip_intwp_p) :: vcnt
191 logical :: found, fastcheckout
192 character(len=ic_lvar) ,
pointer :: vname0(:),vname(:)
193 character(len=ic_lvar2) ,
pointer :: pname0(:),pname(:)
194 integer(kind=ip_intwp_p),
pointer :: inout0(:),inout(:)
195 logical,
parameter :: local_timers_on = .false.
196 character(len=*),
parameter :: subname =
'(oasis_var_setup)'
204 allocate(vname0(prism_nvar))
205 allocate(pname0(prism_nvar))
206 allocate(inout0(prism_nvar))
208 vname0(n) = prism_var(n)%name
209 inout0(n) = prism_var(n)%ops
210 pname0(n) = prism_part(prism_var(n)%part)%partname
214 fastcheck=.true.,fastcheckout=fastcheckout, &
215 linp2=pname0,lout2=pname,linp3=inout0,lout3=inout)
227 if (.not. fastcheckout)
then
235 do while (n < prism_nvar .and. .not.found)
237 if (prism_var(n)%name == vname(v))
then
244 prism_nvar = prism_nvar + 1
247 prism_var(prism_nvar)%name = vname(v)
248 prism_var(prism_nvar)%ops = inout(v)
249 prism_var(prism_nvar)%ncpl = 0
253 do while (p < prism_npart .and. .not.found)
255 if (prism_part(p)%partname == pname(v))
then
260 prism_var(prism_nvar)%part = p
261 if (oasis_debug >= 15)
then
262 write(nulprt,*) subname,
' found part match ',trim(vname(v)),trim(pname(v)),p
265 write(nulprt,*) subname,estr,
'prism part not found part = ',trim(pname(v)),
' var = ',trim(vname(v))
269 if (oasis_debug >= 2)
then
271 write(nulprt,*) subname,
' add var = ',prism_nvar,trim(prism_var(prism_nvar)%name),&
272 prism_var(prism_nvar)%part,&
273 trim(prism_part(prism_var(prism_nvar)%part)%partname),prism_var(prism_nvar)%ops
283 deallocate(vname,pname,inout)
300 character(len=*),
parameter :: subname =
'(oasis_var_zero)'
305 prism_var%name =
'oasis_var_name_unset'
subroutine, public oasis_debug_exit(string)
Used when a subroutine is exited, write info to log file at some debug level.
OASIS partition data and methods.
subroutine, public oasis_def_var(id_nports, cdport, id_part, id_var_nodims, kinout, id_var_shape, ktype, kinfo)
The OASIS user interface to define variables.
Provides a generic and simpler interface into MPI calls for OASIS.
subroutine, public oasis_timer_start(timer_label, barrier)
Start a timer.
subroutine, public oasis_timer_stop(timer_label)
Stop a timer.
Provides a common location for several OASIS variables.
subroutine, public oasis_mpi_reducelists(linp1, comm, cntout, lout1, callstr, fastcheck, fastcheckout, linp2, lout2, spval2, linp3, lout3, spval3)
Custom method for reducing MPI lists across pes for OASIS.
subroutine, public oasis_debug_enter(string)
Used when a subroutine is entered, write info to log file at some debug level.
subroutine, public oasis_flush(nu)
Flushes output to file.
subroutine, public oasis_var_setup()
Synchronize variables across all tasks, called at oasis enddef.
Performance timer methods.
subroutine, public oasis_abort(id_compid, cd_routine, cd_message)
OASIS abort method, publically available to users.
subroutine oasis_var_zero(prism_var)
Zero variable information.
Model variable data for model coupling.
OASIS variable data and methods.
Defines parameters for OASIS.