ROMS
Loading...
Searching...
No Matches
ad_misfit.F
Go to the documentation of this file.
1#include "cppdefs.h"
3
4#if defined ADJOINT && defined FOUR_DVAR && defined OBSERVATIONS && \
5 !defined WEAK_CONSTRAINT
6!
7!git $Id$
8!================================================== Hernan G. Arango ===
9! Copyright (c) 2002-2025 The ROMS Group Andrew M. Moore !
10! Licensed under a MIT/X style license !
11! See License_ROMS.md !
12!=======================================================================
13! !
14! This routine computes the model minus observations adjoint misfit !
15! forcing for each state variable. !
16! !
17! The observation screening and quality control variable "ObsScale" !
18! is not modified in this routine. Their values are the ones set in !
19! obs_write.F during the running of the nonlinear model. !
20! !
21!=======================================================================
22!
23 implicit none
24!
25 CONTAINS
26!
27!***********************************************************************
28 SUBROUTINE ad_misfit (ng, tile, model)
29!***********************************************************************
30!
31 USE mod_param
32 USE mod_grid
33 USE mod_ocean
34 USE mod_stepping
35!
36! Imported variable declarations.
37!
38 integer, intent(in) :: ng, tile, model
39!
40! Local variable declarations.
41!
42# include "tile.h"
43!
44 CALL ad_misfit_tile (ng, tile, model, &
45 & lbi, ubi, lbj, ubj, &
46 & imins, imaxs, jmins, jmaxs, &
47 & kstp(ng), &
48# ifdef SOLVE3D
49 & nstp(ng), &
50# endif
51# ifdef MASKING
52 & grid(ng) % rmask, &
53 & grid(ng) % umask, &
54 & grid(ng) % vmask, &
55# endif
56# ifdef SOLVE3D
57 & grid(ng) % z_r, &
58 & grid(ng) % z_v, &
59 & ocean(ng) % ad_u, &
60 & ocean(ng) % ad_v, &
61 & ocean(ng) % ad_t, &
62# endif
63 & ocean(ng) % ad_ubar, &
64 & ocean(ng) % ad_vbar, &
65 & ocean(ng) % ad_zeta)
66 RETURN
67 END SUBROUTINE ad_misfit
68!
69!***********************************************************************
70 SUBROUTINE ad_misfit_tile (ng, tile, model, &
71 & LBi, UBi, LBj, UBj, &
72 & IminS, ImaxS, JminS, JmaxS, &
73 & kstp, &
74# ifdef SOLVE3D
75 & nstp, &
76# endif
77# ifdef MASKING
78 & rmask, umask, vmask, &
79# endif
80# ifdef SOLVE3D
81 & z_r, z_v, &
82 & ad_u, ad_v, ad_t, &
83# endif
84 & ad_ubar, ad_vbar, ad_zeta)
85!***********************************************************************
86!
87 USE mod_param
88 USE mod_parallel
89 USE mod_fourdvar
90 USE mod_iounits
91 USE mod_ncparam
92 USE mod_scalars
93!
94# ifdef DISTRIBUTE
95 USE distribute_mod, ONLY : mp_collect
96# endif
98# ifdef SOLVE3D
100# endif
101!
102! Imported variable declarations.
103!
104 integer, intent(in) :: ng, tile, model
105 integer, intent(in) :: LBi, UBi, LBj, UBj
106 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
107 integer, intent(in) :: kstp
108# ifdef SOLVE3D
109 integer, intent(in) :: nstp
110# endif
111!
112# ifdef ASSUMED_SHAPE
113# ifdef MASKING
114 real(r8), intent(in) :: rmask(LBi:,LBj:)
115 real(r8), intent(in) :: umask(LBi:,LBj:)
116 real(r8), intent(in) :: vmask(LBi:,LBj:)
117# endif
118# ifdef SOLVE3D
119 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
120 real(r8), intent(inout) :: z_v(LBi:,LBj:,:)
121 real(r8), intent(inout) :: ad_u(LBi:,LBj:,:,:)
122 real(r8), intent(inout) :: ad_v(LBi:,LBj:,:,:)
123 real(r8), intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
124# endif
125 real(r8), intent(inout) :: ad_ubar(LBi:,LBj:,:)
126 real(r8), intent(inout) :: ad_vbar(LBi:,LBj:,:)
127 real(r8), intent(inout) :: ad_zeta(LBi:,LBj:,:)
128# else
129# ifdef MASKING
130 real(r8), intent(in) :: rmask(LBi:UBi,LBj:UBj)
131 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
132 real(r8), intent(in) :: vmask(LBi:UBi,LBj:UBj)
133# endif
134# ifdef SOLVE3D
135 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
136 real(r8), intent(inout) :: z_v(LBi:UBi,LBj:UBj,N(ng))
137 real(r8), intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
138 real(r8), intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
139 real(r8), intent(inout) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
140# endif
141 real(r8), intent(inout) :: ad_ubar(LBi:UBi,LBj:UBj,:)
142 real(r8), intent(inout) :: ad_vbar(LBi:UBi,LBj:UBj,:)
143 real(r8), intent(inout) :: ad_zeta(LBi:UBi,LBj:UBj,:)
144# endif
145!
146! Local variable declarations.
147!
148 integer :: ObsSum, ObsVoid
149 integer :: i, ic, ie, iobs, is, kfrc
150# ifdef SOLVE3D
151 integer :: itrc, j, k, nfrc
152# endif
153 real(r8) :: angle
154
155 real(r8), parameter :: IniVal = 0.0_r8
156
157 real(r8) :: ad_uradial(Mobs), ad_vradial(Mobs)
158
159# include "set_bounds.h"
160!
161!=======================================================================
162! Compute model minus observations adjoint misfit forcing.
163# ifdef DISTRIBUTE
164! Notice that ad_mp_exchange*d calls are not required here
165! (see weak constraint routine ad_htobs.F) because we are
166! using the adjoint state arrays directly which will be
167! exchanged during the initialization step.
168# endif
169!
170! The processing flag used to reject (ObsVetting=0) or accept
171! (ObsVetting=1) observations is computed here but it is never
172! used. The observation screening and quality control variable
173! (ObsScale) is only computed in routine obs_write.
174!=======================================================================
175!
176 IF (processobs(ng)) THEN
177!
178! Set adjoint time index to update.
179!
180 kfrc=kstp
181# ifdef SOLVE3D
182 nfrc=nstp
183# endif
184!
185! Initialize observation reject/accept processing flag.
186!
187 DO iobs=1,mobs
188 obsvetting(iobs)=inival
189 END DO
190!
191! Compute adjoint forcing terms at observation locations.
192!
193 DO iobs=1,nobs(ng)
194 admodval(iobs)=obserr(iobs)* &
195 & (nlmodval(iobs)+tlmodval(iobs)-obsval(iobs))
196 END DO
197!
198!-----------------------------------------------------------------------
199! Load observation reject and accept flag into screening variable.
200!-----------------------------------------------------------------------
201!
202! In the primal formulation, the current time window (or survey)
203! observations are loaded to the working arrays using local indexes
204! (array elements 1:Nobs) as opposed to global indexes in the dual
205! formulation. Recall that the screening variable ObsScale is computed
206! only once to facilitate Background Quality Control on the first pass
207! of the NLM. Therefore, we need to load its values from the saved
208! global arrays values, ObsScaleGlobal.
209!
210 ic=0
211 DO iobs=nstrobs(ng),nendobs(ng)
212 ic=ic+1
213 obsscale(ic)=obsscaleglobal(iobs)
214 END DO
215
216# ifdef BGQC
217!
218!-----------------------------------------------------------------------
219! Reject observations that fail background quality control check.
220!-----------------------------------------------------------------------
221!
222 DO iobs=1,nobs(ng)
223 admodval(iobs)=obsscale(iobs)*admodval(iobs)
224 END DO
225# endif
226!
227!-----------------------------------------------------------------------
228! Free-surface.
229!-----------------------------------------------------------------------
230!
231 IF (fourdvar(ng)%ObsCount(isfsur).gt.0) THEN
232 CALL ad_extract_obs2d (ng, 0, lm(ng)+1, 0, mm(ng)+1, &
233 & lbi, ubi, lbj, ubj, &
235 & mobs, 1, nobs(ng), &
236 & rxmin(ng), rxmax(ng), &
237 & rymin(ng), rymax(ng), &
238 & time(ng), dt(ng), &
239 & obstype, obsvetting, &
240 & tobs, xobs, yobs, &
241 & ad_zeta(:,:,kfrc), &
242# ifdef MASKING
243 & rmask, &
244# endif
245 & admodval)
246 END IF
247!
248!-----------------------------------------------------------------------
249! 2D u-momentum component.
250!-----------------------------------------------------------------------
251!
252 IF (fourdvar(ng)%ObsCount(isubar).gt.0) THEN
253 CALL ad_extract_obs2d (ng, 1, lm(ng)+1, 0, mm(ng)+1, &
254 & lbi, ubi, lbj, ubj, &
256 & mobs, 1, nobs(ng), &
257 & uxmin(ng), uxmax(ng), &
258 & uymin(ng), uymax(ng), &
259 & time(ng), dt(ng), &
260 & obstype, obsvetting, &
261 & tobs, xobs, yobs, &
262 & ad_ubar(:,:,kfrc), &
263# ifdef MASKING
264 & umask, &
265# endif
266 & admodval)
267 END IF
268!
269!-----------------------------------------------------------------------
270! 2D v-momentum component.
271!-----------------------------------------------------------------------
272!
273 IF (fourdvar(ng)%ObsCount(isvbar).gt.0) THEN
274 CALL ad_extract_obs2d (ng, 0, lm(ng)+1, 1, mm(ng)+1, &
275 & lbi, ubi, lbj, ubj, &
277 & mobs, 1, nobs(ng), &
278 & vxmin(ng), vxmax(ng), &
279 & vymin(ng), vymax(ng), &
280 & time(ng), dt(ng), &
281 & obstype, obsvetting, &
282 & tobs, xobs, yobs, &
283 & ad_vbar(:,:,kfrc), &
284# ifdef MASKING
285 & vmask, &
286# endif
287 & admodval)
288 END IF
289
290# ifdef SOLVE3D
291!
292!-----------------------------------------------------------------------
293! 3D u-momentum component.
294!-----------------------------------------------------------------------
295!
296 IF (fourdvar(ng)%ObsCount(isuvel).gt.0) THEN
297 DO k=1,n(ng)
298 DO j=jstr-1,jend+1
299 DO i=istru-1,iend+1
300 z_v(i,j,k)=0.5_r8*(z_r(i-1,j,k)+ &
301 & z_r(i ,j,k))
302 END DO
303 END DO
304 END DO
305 CALL ad_extract_obs3d (ng, 1, lm(ng)+1, 0, mm(ng)+1, &
306 & lbi, ubi, lbj, ubj, 1, n(ng), &
308 & mobs, 1, nobs(ng), &
309 & uxmin(ng), uxmax(ng), &
310 & uymin(ng), uymax(ng), &
311 & time(ng), dt(ng), &
312 & obstype, obsvetting, &
313 & tobs, xobs, yobs, zobs, &
314 & ad_u(:,:,:,nfrc), &
315 & z_v, &
316# ifdef MASKING
317 & umask, &
318# endif
319 & admodval)
320 END IF
321!
322!-----------------------------------------------------------------------
323! 3D v-momentum component.
324!-----------------------------------------------------------------------
325!
326 IF (fourdvar(ng)%ObsCount(isvvel).gt.0) THEN
327 DO k=1,n(ng)
328 DO j=jstrv-1,jend+1
329 DO i=istr-1,iend+1
330 z_v(i,j,k)=0.5_r8*(z_r(i,j-1,k)+ &
331 & z_r(i,j ,k))
332 END DO
333 END DO
334 END DO
335 CALL ad_extract_obs3d (ng, 0, lm(ng)+1, 1, mm(ng)+1, &
336 & lbi, ubi, lbj, ubj, 1, n(ng), &
338 & mobs, 1, nobs(ng), &
339 & vxmin(ng), vxmax(ng), &
340 & vymin(ng), vymax(ng), &
341 & time(ng), dt(ng), &
342 & obstype, obsvetting, &
343 & tobs, xobs, yobs, zobs, &
344 & ad_v(:,:,:,nfrc), &
345 & z_v, &
346# ifdef MASKING
347 & vmask, &
348# endif
349 & admodval)
350 END IF
351!
352!-----------------------------------------------------------------------
353! Radial Velocity. The observations are in terms of radial speed and
354! angle (stored in obs_meta). The observation angle converts the
355! velocity components to geographical EAST and North components.
356# ifdef RADIAL_ANGLE_CCW_EAST
357! The radial velocity observations are processed as magnitude and
358! heading angle (obs_meta; radians) in the math convention: an
359! azimuth that is counterclockwise from TRUE East.
360!
361! In curvilinear coordinates, the radial forward problem is:
362!
363! radial = u * COS(obs_meta - angler) + v * SIN(obs_meta - angler)
364!
365! In the adjoint, we get:
366!
367! ad_vradial = ad_vradial + ADmodVal * SIN(obs_meta - angler)
368! ad_uradial = ad_uradial + ADmodVal * COS(obs_meta - angler)
369# else
370! By default, the radial velocity observations are processed as
371! magnitude and heading angle (obs_meta; radians) in the navigation
372! convention: an azimuth that is clockwise from TRUE North.
373!
374! In curvilinear coordinates, the radial forward problem is:
375!
376! radial = u * SIN(obs_meta + angler) + v * COS(obs_meta + angler)
377!
378! In the adjoint, we get:
379!
380! ad_vradial = ad_vradial + ADmodVal * COS(obs_meta + angler)
381! ad_uradial = ad_uradial + ADmodVal * SIN(obs_meta + angler)
382# endif
383!-----------------------------------------------------------------------
384!
385 IF (fourdvar(ng)%ObsCount(isradial).gt.0) THEN
386 DO iobs=1,nobs(ng)
387 ad_uradial(iobs)=inival
388 ad_vradial(iobs)=inival
389 END DO
390 DO iobs=1,nobs(ng)
391 IF (obstype(iobs).eq.obsstate2type(isradial)) THEN
392# ifdef RADIAL_ANGLE_CCW_EAST
393# ifdef CURVGRID
394 angle=obsmeta(iobs)-obsangler(iobs)
395 ad_uradial(iobs)=ad_uradial(iobs)+ &
396 & admodval(iobs)*cos(angle)
397 ad_vradial(iobs)=ad_vradial(iobs)+ &
398 & admodval(iobs)*sin(angle)
399# else
400 ad_uradial(iobs)=ad_uradial(iobs)+ &
401 & admodval(iobs)*cos(obsmeta(iobs))
402 ad_vradial(iobs)=ad_vradial(iobs)+ &
403 & admodval(iobs)*sin(obsmeta(iobs))
404# endif
405# else
406# ifdef CURVGRID
407 angle=obsmeta(iobs)+obsangler(iobs)
408 ad_uradial(iobs)=ad_uradial(iobs)+ &
409 & admodval(iobs)*sin(angle)
410 ad_vradial(iobs)=ad_vradial(iobs)+ &
411 & admodval(iobs)*cos(angle)
412# else
413 ad_uradial(iobs)=ad_uradial(iobs)+ &
414 & admodval(iobs)*sin(obsmeta(iobs))
415 ad_vradial(iobs)=ad_vradial(iobs)+ &
416 & admodval(iobs)*cos(obsmeta(iobs))
417# endif
418# endif
419 END IF
420 END DO
421 DO k=1,n(ng)
422 DO j=jstrv-1,jend+1
423 DO i=istr-1,iend+1
424 z_v(i,j,k)=0.5_r8*(z_r(i,j-1,k)+ &
425 & z_r(i,j ,k))
426 END DO
427 END DO
428 END DO
429 CALL ad_extract_obs3d (ng, 0, lm(ng)+1, 1, mm(ng)+1, &
430 & lbi, ubi, lbj, ubj, 1, n(ng), &
432 & mobs, 1, nobs(ng), &
433 & vxmin(ng), vxmax(ng), &
434 & vymin(ng), vymax(ng), &
435 & time(ng), dt(ng), &
436 & obstype, obsvetting, &
437 & tobs, xobs, yobs, zobs, &
438 & ad_v(:,:,:,nfrc), z_v, &
439# ifdef MASKING
440 & vmask, &
441# endif
442 & ad_vradial)
443 DO k=1,n(ng)
444 DO j=jstr-1,jend+1
445 DO i=istru-1,iend+1
446 z_v(i,j,k)=0.5_r8*(z_r(i-1,j,k)+ &
447 & z_r(i ,j,k))
448 END DO
449 END DO
450 END DO
451 CALL ad_extract_obs3d (ng, 1, lm(ng)+1, 0, mm(ng)+1, &
452 & lbi, ubi, lbj, ubj, 1, n(ng), &
454 & mobs, 1, nobs(ng), &
455 & uxmin(ng), uxmax(ng), &
456 & uymin(ng), uymax(ng), &
457 & time(ng), dt(ng), &
458 & obstype, obsvetting, &
459 & tobs, xobs, yobs, zobs, &
460 & ad_u(:,:,:,nfrc), z_v, &
461# ifdef MASKING
462 & umask, &
463# endif
464 & ad_uradial)
465 END IF
466!
467!-----------------------------------------------------------------------
468! Tracer type variables.
469!-----------------------------------------------------------------------
470!
471 DO itrc=1,nt(ng)
472 IF (fourdvar(ng)%ObsCount(istvar(itrc)).gt.0) THEN
473 CALL ad_extract_obs3d (ng, 0, lm(ng)+1, 0, mm(ng)+1, &
474 & lbi, ubi, lbj, ubj, 1, n(ng), &
475 & obsstate2type(istvar(itrc)), &
476 & mobs, 1, nobs(ng), &
477 & rxmin(ng), rxmax(ng), &
478 & rymin(ng), rymax(ng), &
479 & time(ng), dt(ng), &
480 & obstype, obsvetting, &
481 & tobs, xobs, yobs, zobs, &
482 & ad_t(:,:,:,nfrc,itrc), &
483 & z_r, &
484# ifdef MASKING
485 & rmask, &
486# endif
487 & admodval)
488 END IF
489 END DO
490# endif
491# ifdef DISTRIBUTE
492!
493!-----------------------------------------------------------------------
494! For debugging purposes, collect all observations reject/accept
495! processing flag.
496!-----------------------------------------------------------------------
497!
498 CALL mp_collect (ng, model, mobs, inival, obsvetting)
499# endif
500!
501!-----------------------------------------------------------------------
502! Set counters for the number of rejected observations for each state
503! variable. Although unnecessary, the counters are recomputed here to
504! check if "ObsScale" changed from its initial values.
505!-----------------------------------------------------------------------
506!
507 DO iobs=1,nobs(ng)
508 IF (obsscale(iobs).lt.1.0) THEN
509 IF (obstype(iobs).eq.obsstate2type(isfsur)) THEN
510 fourdvar(ng)%ObsReject(isfsur)= &
511 & fourdvar(ng)%ObsReject(isfsur)+1
512 ELSE IF (obstype(iobs).eq.obsstate2type(isubar)) THEN
513 fourdvar(ng)%ObsReject(isubar)= &
514 & fourdvar(ng)%ObsReject(isubar)+1
515 ELSE IF (obstype(iobs).eq.obsstate2type(isvbar)) THEN
516 fourdvar(ng)%ObsReject(isvbar)= &
517 & fourdvar(ng)%ObsReject(isvbar)+1
518# ifdef SOLVE3D
519 ELSE IF (obstype(iobs).eq.obsstate2type(isuvel)) THEN
520 fourdvar(ng)%ObsReject(isuvel)= &
521 & fourdvar(ng)%ObsReject(isuvel)+1
522 ELSE IF (obstype(iobs).eq.obsstate2type(isvvel)) THEN
523 fourdvar(ng)%ObsReject(isvvel)= &
524 & fourdvar(ng)%ObsReject(isvvel)+1
525 ELSE IF (obstype(iobs).eq.obsstate2type(isradial)) THEN
526 fourdvar(ng)%ObsReject(isradial)= &
527 & fourdvar(ng)%ObsReject(isradial)+1
528 ELSE
529 DO itrc=1,nt(ng)
530 IF (obstype(iobs).eq.obsstate2type(istvar(itrc))) THEN
531 i=istvar(itrc)
532 fourdvar(ng)%ObsReject(i)=fourdvar(ng)%ObsReject(i)+1
533 END IF
534 END DO
535# endif
536 END IF
537 END IF
538 END DO
539!
540! Load total available and rejected observations into structure
541! array.
542!
543 DO i=1,nobsvar(ng)
544 fourdvar(ng)%ObsCount(0)=fourdvar(ng)%ObsCount(0)+ &
545 & fourdvar(ng)%ObsCount(i)
546 fourdvar(ng)%ObsReject(0)=fourdvar(ng)%ObsReject(0)+ &
547 & fourdvar(ng)%ObsReject(i)
548 END DO
549!
550! Report.
551!
552 IF (domain(ng)%SouthWest_Test(tile)) THEN
553 IF (master) THEN
554 obssum=0
555 obsvoid=0
556 is=nstrobs(ng)
557 DO i=1,nobsvar(ng)
558 IF (fourdvar(ng)%ObsCount(i).gt.0) THEN
559 ie=is+fourdvar(ng)%ObsCount(i)-1
560 WRITE (stdout,10) trim(obsname(i)), is, ie, &
561 & ie-is+1, fourdvar(ng)%ObsReject(i)
562 is=ie+1
563 obssum=obssum+fourdvar(ng)%ObsCount(i)
564 obsvoid=obsvoid+fourdvar(ng)%ObsReject(i)
565 END IF
566 END DO
567 WRITE (stdout,20) obssum, obsvoid, &
568 & fourdvar(ng)%ObsCount(0), &
569 & fourdvar(ng)%ObsReject(0)
570 WRITE (stdout,30) time_code(ng), nstrobs(ng), nendobs(ng), &
571 & iic(ng)
572 10 FORMAT (10x,a,t25,4(1x,i10))
573 20 FORMAT (/,10x,'Total',t47,2(1x,i10), &
574 & /,10x,'Obs Tally',t47,2(1x,i10),/)
575 30 FORMAT (2x,' AD_MISFIT - Added observations misfit ', &
576 & 'forcing,',t75,a,/,22x,'(Observation ', &
577 & 'records = ',i0,' - ',i0,', iic = ',i0,')')
578 END IF
579 END IF
580 END IF
581 RETURN
582 END SUBROUTINE ad_misfit_tile
583#endif
584 END MODULE ad_misfit_mod
subroutine, public ad_extract_obs3d(ng, imin, imax, jmin, jmax, lbi, ubi, lbj, ubj, lbk, ubk, ifield, mobs, nobsstr, nobsend, xmin, xmax, ymin, ymax, time, dt, obstype, obsvetting, tobs, xobs, yobs, zobs, ad_a, adepth, amask, ad_aobs)
subroutine, public ad_extract_obs2d(ng, imin, imax, jmin, jmax, lbi, ubi, lbj, ubj, ifield, mobs, nobsstr, nobsend, xmin, xmax, ymin, ymax, time, dt, obstype, obsvetting, tobs, xobs, yobs, ad_a, amask, ad_aobs)
subroutine ad_misfit(ng, tile, model)
Definition ad_misfit.F:29
subroutine ad_misfit_tile(ng, tile, model, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kstp, nstp, rmask, umask, vmask, z_r, z_v, ad_u, ad_v, ad_t, ad_ubar, ad_vbar, ad_zeta)
Definition ad_misfit.F:85
type(t_fourdvar), dimension(:), allocatable fourdvar
integer, dimension(:), allocatable nobs
real(r8), dimension(:), allocatable obsvetting
integer, dimension(:), allocatable nobsvar
real(r8), dimension(:), allocatable obsval
real(r8), dimension(:), allocatable obsangler
real(r8), dimension(:), allocatable obsscale
real(r8), dimension(:), allocatable obserr
real(r8), dimension(:), allocatable obsmeta
integer, dimension(:), allocatable obstype
real(r8), dimension(:), allocatable admodval
real(r8), dimension(:), allocatable zobs
real(r8), dimension(:), allocatable nlmodval
real(dp), dimension(:), allocatable tobs
real(r8), dimension(:), allocatable xobs
integer, dimension(:), allocatable obsstate2type
real(r8), dimension(:), allocatable yobs
character(len=40), dimension(:), allocatable obsname
integer, dimension(:), allocatable nstrobs
logical, dimension(:), allocatable processobs
integer, dimension(:), allocatable nendobs
type(t_grid), dimension(:), allocatable grid
Definition mod_grid.F:365
integer stdout
real(r8), dimension(:), allocatable rymin
integer isvvel
real(r8), dimension(:), allocatable vymin
integer isvbar
real(r8), dimension(:), allocatable rymax
real(r8), dimension(:), allocatable uymin
real(r8), dimension(:), allocatable vymax
real(r8), dimension(:), allocatable uxmin
real(r8), dimension(:), allocatable uxmax
real(r8), dimension(:), allocatable rxmax
integer, dimension(:), allocatable istvar
integer isuvel
real(r8), dimension(:), allocatable uymax
real(r8), dimension(:), allocatable vxmin
integer isfsur
integer isubar
real(r8), dimension(:), allocatable vxmax
integer isradial
real(r8), dimension(:), allocatable rxmin
type(t_ocean), dimension(:), allocatable ocean
Definition mod_ocean.F:351
logical master
type(t_domain), dimension(:), allocatable domain
Definition mod_param.F:329
integer, dimension(:), allocatable lm
Definition mod_param.F:455
integer, dimension(:), allocatable mm
Definition mod_param.F:456
integer, dimension(:), allocatable iic
real(dp), dimension(:), allocatable dt
character(len=22), dimension(:), allocatable time_code
real(dp), dimension(:), allocatable time
integer, dimension(:), allocatable kstp
integer, dimension(:), allocatable nstp