FV3-JEDI
atm.F90
Go to the documentation of this file.
1 module atm
2 
3  !-----------------------------------------------------------------------------
4  ! ATM Component.
5  !-----------------------------------------------------------------------------
6 
7  use esmf
8  use nuopc
9  use nuopc_model, &
10  model_routine_ss => setservices, &
11  model_label_advance => label_advance
12 
13  implicit none
14 
15  private
16 
17  public setservices
18 
19  !-----------------------------------------------------------------------------
20  contains
21  !-----------------------------------------------------------------------------
22 
23  subroutine setservices(model, rc)
24  type(esmf_gridcomp) :: model
25  integer, intent(out) :: rc
26 
27  rc = esmf_success
28 
29  ! the NUOPC model component will register the generic methods
30  call nuopc_compderive(model, model_routine_ss, rc=rc)
31  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
32  line=__line__, &
33  file=__file__)) &
34  return ! bail out
35 
36  ! set entry point for methods that require specific implementation
37  call nuopc_compsetentrypoint(model, esmf_method_initialize, &
38  phaselabellist=(/"IPDv00p1"/), userroutine=initializep1, rc=rc)
39  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
40  line=__line__, &
41  file=__file__)) &
42  return ! bail out
43  call nuopc_compsetentrypoint(model, esmf_method_initialize, &
44  phaselabellist=(/"IPDv00p2"/), userroutine=initializep2, rc=rc)
45  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
46  line=__line__, &
47  file=__file__)) &
48  return ! bail out
49 
50  ! attach specializing method(s)
51  call nuopc_compspecialize(model, speclabel=model_label_advance, &
52  specroutine=modeladvance, rc=rc)
53  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
54  line=__line__, &
55  file=__file__)) &
56  return ! bail out
57 
58  end subroutine
59 
60  !-----------------------------------------------------------------------------
61 
62  subroutine initializep1(model, importState, exportState, clock, rc)
63  type(esmf_gridcomp) :: model
64  type(esmf_state) :: importState, exportState
65  type(esmf_clock) :: clock
66  integer, intent(out) :: rc
67 
68  rc = esmf_success
69 
70  ! importable field: sea_surface_temperature
71  call nuopc_advertise(importstate, &
72  standardname="sea_surface_temperature", name="sst", rc=rc)
73  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
74  line=__line__, &
75  file=__file__)) &
76  return ! bail out
77 
78  ! exportable field: air_pressure_at_sea_level
79  call nuopc_advertise(exportstate, &
80  standardname="air_pressure_at_sea_level", name="pmsl", rc=rc)
81  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
82  line=__line__, &
83  file=__file__)) &
84  return ! bail out
85 
86  ! exportable field: surface_net_downward_shortwave_flux
87  call nuopc_advertise(exportstate, &
88  standardname="surface_net_downward_shortwave_flux", name="rsns", rc=rc)
89  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
90  line=__line__, &
91  file=__file__)) &
92  return ! bail out
93 
94  end subroutine
95 
96  !-----------------------------------------------------------------------------
97 
98  subroutine initializep2(model, importState, exportState, clock, rc)
99  type(esmf_gridcomp) :: model
100  type(esmf_state) :: importState, exportState
101  type(esmf_clock) :: clock
102  integer, intent(out) :: rc
103 
104  ! local variables
105  type(esmf_field) :: field
106  type(esmf_grid) :: gridIn
107  type(esmf_grid) :: gridOut
108 
109  rc = esmf_success
110 
111  ! create a Grid object for Fields
112  gridin = esmf_gridcreatenoperidimufrm(maxindex=(/20, 100/), &
113  mincornercoord=(/10._esmf_kind_r8, 20._esmf_kind_r8/), &
114  maxcornercoord=(/100._esmf_kind_r8, 200._esmf_kind_r8/), &
115  coordsys=esmf_coordsys_cart, staggerloclist=(/esmf_staggerloc_center/), &
116  rc=rc)
117  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
118  line=__line__, &
119  file=__file__)) &
120  return ! bail out
121  gridout = gridin ! for now out same as in
122 
123  ! importable field: sea_surface_temperature
124  field = esmf_fieldcreate(name="sst", grid=gridin, &
125  typekind=esmf_typekind_r8, rc=rc)
126  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
127  line=__line__, &
128  file=__file__)) &
129  return ! bail out
130  call nuopc_realize(importstate, field=field, rc=rc)
131  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
132  line=__line__, &
133  file=__file__)) &
134  return ! bail out
135 
136  ! exportable field: air_pressure_at_sea_level
137  field = esmf_fieldcreate(name="pmsl", grid=gridout, &
138  typekind=esmf_typekind_r8, rc=rc)
139  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
140  line=__line__, &
141  file=__file__)) &
142  return ! bail out
143  call nuopc_realize(exportstate, field=field, rc=rc)
144  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
145  line=__line__, &
146  file=__file__)) &
147  return ! bail out
148 
149  ! exportable field: surface_net_downward_shortwave_flux
150  field = esmf_fieldcreate(name="rsns", grid=gridout, &
151  typekind=esmf_typekind_r8, rc=rc)
152  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
153  line=__line__, &
154  file=__file__)) &
155  return ! bail out
156  call nuopc_realize(exportstate, field=field, rc=rc)
157  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
158  line=__line__, &
159  file=__file__)) &
160  return ! bail out
161 
162  end subroutine
163 
164  !-----------------------------------------------------------------------------
165 
166  subroutine modeladvance(model, rc)
167  type(esmf_gridcomp) :: model
168  integer, intent(out) :: rc
169 
170  ! local variables
171  type(esmf_clock) :: clock
172  type(esmf_state) :: importState, exportState
173 
174  type (ESMF_Field) :: field
175  type(esmf_fieldstatus_flag) :: fieldStatus
176  real(8), pointer :: sst(:,:)
177  real(8), pointer :: pmsl(:,:)
178  integer :: LB(2), UB(2)
179 
180  integer, save :: init = 0
181 
182  rc = esmf_success
183 
184  ! query the Component for its clock, importState and exportState
185  call nuopc_modelget(model, modelclock=clock, importstate=importstate, &
186  exportstate=exportstate, rc=rc)
187  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
188  line=__line__, &
189  file=__file__)) &
190  return ! bail out
191 
192  ! HERE THE MODEL ADVANCES: currTime -> currTime + timeStep
193 
194  ! Because of the way that the internal Clock was set by default,
195  ! its timeStep is equal to the parent timeStep. As a consequence the
196  ! currTime + timeStep is equal to the stopTime of the internal Clock
197  ! for this call of the ModelAdvance() routine.
198 
199  call esmf_clockprint(clock, options="currTime", &
200  prestring="------>Advancing ATM from: ", rc=rc)
201  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
202  line=__line__, &
203  file=__file__)) &
204  return ! bail out
205 
206  call esmf_clockprint(clock, options="stopTime", &
207  prestring="--------------------------------> to: ", rc=rc)
208  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
209  line=__line__, &
210  file=__file__)) &
211  return ! bail out
212 
213  !Psuedo operations on sst for testing purposes
214  !---------------------------------------------
215 
216  !sst
217  call esmf_stateget(importstate, "sst", field, rc=rc)
218  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
219  line=__line__, &
220  file=__file__)) &
221  return ! bail out
222  call esmf_fieldget(field, status=fieldstatus, rc=rc)
223  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
224  line=__line__, &
225  file=__file__)) &
226  return ! bail out
227  call esmf_fieldget(field, 0, sst, computationallbound=lb, rc=rc)
228  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
229  line=__line__, &
230  file=__file__)) &
231  return ! bail out
232 
233  !pmsl
234  call esmf_stateget(exportstate, "pmsl", field, rc=rc)
235  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
236  line=__line__, &
237  file=__file__)) &
238  return ! bail out
239  call esmf_fieldget(field, status=fieldstatus, rc=rc)
240  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
241  line=__line__, &
242  file=__file__)) &
243  return ! bail out
244  call esmf_fieldget(field, 0, pmsl, computationallbound=lb, rc=rc)
245  if (esmf_logfounderror(rctocheck=rc, msg=esmf_logerr_passthru, &
246  line=__line__, &
247  file=__file__)) &
248  return ! bail out
249 
250  pmsl = sst
251 
252  print*, "ATM-DATA sst", sst(lb(1),lb(2)), pmsl(lb(1),lb(2))
253 
254  nullify(sst,pmsl)
255 
256  end subroutine
257 
258 end module
atm
Definition: atm.F90:1
atm::initializep2
subroutine initializep2(model, importState, exportState, clock, rc)
Definition: atm.F90:99
model
Definition: model.py:1
atm::initializep1
subroutine initializep1(model, importState, exportState, clock, rc)
Definition: atm.F90:63
atm::modeladvance
subroutine modeladvance(model, rc)
Definition: atm.F90:167
atm::setservices
subroutine, public setservices(model, rc)
Definition: atm.F90:24