ROMS
Loading...
Searching...
No Matches
checkvars_mod Module Reference

Data Types

interface  checkvars
 

Functions/Subroutines

subroutine checkvars_nf90 (ng, model, ncname, ncid, string, nrec, nvar, tvarnam, get_var, have_var)
 
subroutine checkvars_pio (ng, model, ncname, piofile, string, nrec, nvar, tvarnam, get_var, have_var)
 

Function/Subroutine Documentation

◆ checkvars_nf90()

subroutine checkvars_mod::checkvars_nf90 ( integer, intent(in) ng,
integer, intent(in) model,
character (len=*), intent(in) ncname,
integer, intent(in) ncid,
character (len=*), intent(in) string,
integer, intent(inout) nrec,
integer, intent(in) nvar,
character (len=*), intent(inout) tvarnam,
logical, dimension(nvar), intent(out) get_var,
logical, dimension(nvar), intent(out) have_var )

Definition at line 73 of file checkvars.F.

75!***********************************************************************
76!
77 USE mod_netcdf
78!
79! Imported variable declarations.
80!
81 integer, intent(in) :: ng, model, ncid, Nvar
82 integer, intent(inout) :: Nrec
83!
84 character (len=*), intent(in) :: ncname
85 character (len=*), intent(in) :: string
86
87 character (len=*), intent(inout) :: tvarnam
88!
89 logical, dimension(Nvar), intent(out) :: get_var
90 logical, dimension(Nvar), intent(out) :: have_var
91!
92! Local variable declarations.
93!
94 integer :: IDmod, i, itrc
95!
96 character (len=*), parameter :: MyFile = &
97 & __FILE__//", checkvars_nf90"
98!
99 sourcefile=myfile
100!
101!-----------------------------------------------------------------------
102! Determine state variables needed and check if they are available in
103! requested NetCDF file.
104!-----------------------------------------------------------------------
105!
106! Limit model identifier. The profiling is limited to iNLM, iTLM, iRPM,
107! and iADM.
108!
109 IF ((model.lt.1).or.(model.gt.4)) THEN
110 idmod=inlm
111 ELSE
112 idmod=model
113 END IF
114!
115! Inquire about the dimensions and check for consistency.
116!
117 CALL netcdf_check_dim (ng, idmod, ncname, &
118 & ncid = ncid)
119 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
120 nrec=rec_size
121!
122! Inquire about the variables.
123!
124 CALL netcdf_check_var (ng, idmod, ncname, &
125 & ncid = ncid)
126 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
127!
128! Initialize logical switches.
129!
130 DO i=1,nvar
131 get_var(i)=.false.
132 have_var(i)=.false.
133 END DO
134!
135! Determine state variables to read from input NetCDF file. Notice
136! that these state variable are only assigned if input flag model < 12,
137! model = 14, or model = 15. That is, all the state variables associated
138! with ROMS prognostic equations. The remaining values are used to
139! process open boundary condition or surface forcing variable in the
140! 4D-Var control vector.
141!
142 IF ((model.le.11).or.(model.eq.14).or.(model.eq.15)) THEN
143#ifdef ANA_INITIAL
144 IF (nrrec(ng).ne.0) THEN
145 get_var(idfsur)=.true.
146 get_var(idubar)=.true.
147 get_var(idvbar)=.true.
148# ifdef SOLVE3D
149 get_var(iduvel)=.true.
150 get_var(idvvel)=.true.
151 DO itrc=1,nat
152 get_var(idtvar(itrc))=.true.
153 END DO
154# endif
155 END IF
156#else
157 get_var(idfsur)=.true.
158 IF (model.ne.7) THEN ! not needed by impulse forcing
159 get_var(idubar)=.true.
160 get_var(idvbar)=.true.
161 END IF
162# ifdef SOLVE3D
163 get_var(iduvel)=.true.
164 get_var(idvvel)=.true.
165 DO itrc=1,nat
166 get_var(idtvar(itrc))=.true.
167 END DO
168# endif
169#endif
170#ifdef SOLVE3D
171# if defined BIOLOGY
172# if defined ANA_BIOLOGY
173 IF (nrrec(ng).ne.0) THEN
174 DO itrc=1,nbt
175 get_var(idtvar(idbio(itrc)))=.true.
176 END DO
177 END IF
178# else
179 DO itrc=1,nbt
180 get_var(idtvar(idbio(itrc)))=.true.
181 END DO
182# endif
183# endif
184# if defined T_PASSIVE
185# if defined ANA_PASSIVE
186 IF (nrrec(ng).ne.0) THEN
187 DO itrc=1,npt
188 get_var(idtvar(inert(itrc)))=.true.
189 END DO
190 END IF
191# else
192 DO itrc=1,npt
193 get_var(idtvar(inert(itrc)))=.true.
194 END DO
195# endif
196# endif
197# ifdef SEDIMENT
198# ifdef ANA_SEDIMENT
199 IF (nrrec(ng).ne.0) THEN
200 DO itrc=1,nst
201 get_var(idtvar(idsed(itrc)))=.true.
202 get_var(idfrac(itrc))=.true.
203 get_var(idbmas(itrc))=.true.
204 END DO
205 DO itrc=1,mbedp
206 get_var(idsbed(itrc))=.true.
207 END DO
208 END IF
209# else
210 DO itrc=1,nst
211 get_var(idtvar(idsed(itrc)))=.true.
212 get_var(idfrac(itrc))=.true.
213 get_var(idbmas(itrc))=.true.
214 END DO
215 DO itrc=1,mbedp
216 get_var(idsbed(itrc))=.true.
217 END DO
218# endif
219# ifdef BEDLOAD
220 IF (nrrec(ng).ne.0) THEN
221 DO itrc=1,nst
222 get_var(idubld(itrc))=.true.
223 get_var(idvbld(itrc))=.true.
224 END DO
225 END IF
226# endif
227# ifdef SED_MORPH
228 IF (nrrec(ng).ne.0) THEN
229 get_var(idbath)=.true.
230 END IF
231# endif
232# endif
233# if defined SEDIMENT || defined BBL_MODEL
234# ifndef ANA_SEDIMENT
235 DO itrc=1,mbotp
236 get_var(idbott(itrc))=.true.
237 END DO
238# endif
239# endif
240# ifdef ICE_MODEL
241 DO i=1,nices
242 IF (isice(i).gt.0) THEN
243 get_var(isice(i))=.true.
244 END IF
245 END DO
246# endif
247#endif
248#ifdef PERFECT_RESTART
249!
250! Determine perfect restart fields to read from input NetCDF file.
251!
252 IF (((model.eq.0).or.(model.eq.inlm)).and.(nrrec(ng).ne.0)) THEN
253# ifdef SOLVE3D
254 get_var(idru3d)=.true.
255 get_var(idrv3d)=.true.
256# endif
257 get_var(idrzet)=.true.
258 get_var(idru2d)=.true.
259 get_var(idrv2d)=.true.
260# if defined GLS_MIXING || defined MY25_MIXING
261 get_var(idmtke)=.true.
262 get_var(idmtls)=.true.
263 get_var(idvmls)=.true.
264 get_var(idvmkk)=.true.
265# ifdef GLS_MIXING
266 get_var(idvmkp)=.true.
267# endif
268# endif
269 END IF
270#endif
271 END IF
272#ifdef ADJUST_BOUNDARY
273!
274! Determine 4DVar boundary variables to adjust.
275!
276 IF ((model.eq.iadm).or.(model.eq.itlm).or.(model.eq.inlm).or. &
277 & (model.eq.irpm).or.(model.eq.5).or.(model.eq.12).or. &
278 & (model.eq.16)) THEN
279 IF (any(lobc(:,isfsur,ng))) THEN
280 get_var(idsbry(isfsur))=.true.
281 END IF
282 IF (any(lobc(:,isubar,ng))) THEN
283 get_var(idsbry(isubar))=.true.
284 END IF
285 IF (any(lobc(:,isvbar,ng))) THEN
286 get_var(idsbry(isvbar))=.true.
287 END IF
288# ifdef SOLVE3D
289 IF (any(lobc(:,isuvel,ng))) THEN
290 get_var(idsbry(isuvel))=.true.
291 END IF
292 IF (any(lobc(:,isvvel,ng))) THEN
293 get_var(idsbry(isvvel))=.true.
294 END IF
295 DO itrc=1,nt(ng)
296 IF (any(lobc(:,istvar(itrc),ng))) THEN
297 get_var(idsbry(istvar(itrc)))=.true.
298 END IF
299 END DO
300# endif
301 END IF
302#endif
303#if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
304!
305! Determine 4DVar surface forcing variables to adjust.
306!
307 IF ((model.eq.iadm).or.(model.eq.itlm).or.(model.eq.inlm).or. &
308 & (model.eq.irpm).or.(model.eq.5).or.(model.eq.13).or. &
309 & (model.eq.17)) THEN
310# ifdef ADJUST_STFLUX
311 DO itrc=1,nt(ng)
312 IF (lstflux(itrc,ng)) THEN
313 get_var(idtsur(itrc))=.true.
314 END IF
315 END DO
316# endif
317# ifdef ADJUST_WSTRESS
318 get_var(idusms)=.true.
319 get_var(idvsms)=.true.
320# endif
321 END IF
322#endif
323!
324! Scan variable list from input NetCDF and activate switches for
325! model state variables.
326!
327 DO i=1,n_var
328 IF (trim(var_name(i)).eq.trim(vname(1,idtime))) THEN
329 tvarnam=trim(var_name(i))
330 have_var(idtime)=.true.
331#if defined SEDIMENT && defined SED_MORPH
332 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idbath))) THEN
333 have_var(idbath)=.true.
334#endif
335#ifdef ADJUST_BOUNDARY
336 ELSE IF (any(lobc(:,isfsur,ng)).and. &
337 & (trim(var_name(i)).eq. &
338 & trim(vname(1,idsbry(isfsur))))) THEN
339 have_var(idsbry(isfsur))=.true.
340 ELSE IF (any(lobc(:,isubar,ng)).and. &
341 & (trim(var_name(i)).eq. &
342 & trim(vname(1,idsbry(isubar))))) THEN
343 have_var(idsbry(isubar))=.true.
344 ELSE IF (any(lobc(:,isvbar,ng)).and. &
345 & (trim(var_name(i)).eq. &
346 & trim(vname(1,idsbry(isvbar))))) THEN
347 have_var(idsbry(isvbar))=.true.
348# ifdef SOLVE3D
349 ELSE IF (any(lobc(:,isuvel,ng)).and. &
350 & (trim(var_name(i)).eq. &
351 & trim(vname(1,idsbry(isuvel))))) THEN
352 have_var(idsbry(isuvel))=.true.
353 ELSE IF (any(lobc(:,isvvel,ng)).and. &
354 & (trim(var_name(i)).eq. &
355 & trim(vname(1,idsbry(isvvel))))) THEN
356 have_var(idsbry(isvvel))=.true.
357# endif
358#endif
359#ifdef SOLVE3D
360 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idkver))) THEN
361 have_var(idkver)=.true.
362 ELSE IF (trim(var_name(i)).eq.trim(vname(1,iduvel))) THEN
363 have_var(iduvel)=.true.
364 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idru3d))) THEN
365 have_var(idru3d)=.true.
366 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvvel))) THEN
367 have_var(idvvel)=.true.
368 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idrv3d))) THEN
369 have_var(idrv3d)=.true.
370# if defined GLS_MIXING || defined MY25_MIXING || defined LMD_MIXING
371 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvvis))) THEN
372 have_var(idvvis)=.true.
373 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idtdif))) THEN
374 have_var(idtdif)=.true.
375 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idsdif))) THEN
376 have_var(idsdif)=.true.
377# ifdef LMD_SKPP
378 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idhsbl))) THEN
379 have_var(idhsbl)=.true.
380# endif
381# ifdef LMD_BKPP
382 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idhbbl))) THEN
383 have_var(idhbbl)=.true.
384# endif
385# ifdef LMD_NONLOCAL
386 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idghat(itemp)))) THEN
387 have_var(idghat(itemp))=.true.
388# ifdef SALINITY
389 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idghat(isalt)))) THEN
390 have_var(idghat(isalt))=.true.
391# endif
392# endif
393# endif
394# if defined GLS_MIXING || defined MY25_MIXING
395 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idmtke))) THEN
396 have_var(idmtke)=.true.
397 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idmtls))) THEN
398 have_var(idmtls)=.true.
399 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvmls))) THEN
400 have_var(idvmls)=.true.
401 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvmkk))) THEN
402 have_var(idvmkk)=.true.
403# ifdef GLS_MIXING
404 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvmkp))) THEN
405 have_var(idvmkp)=.true.
406# endif
407# endif
408#endif
409#ifdef ADJUST_WSTRESS
410 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idusms))) THEN
411 have_var(idusms)=.true.
412 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvsms))) THEN
413 have_var(idvsms)=.true.
414#endif
415 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idfsur))) THEN
416 have_var(idfsur)=.true.
417 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idrzet))) THEN
418 have_var(idrzet)=.true.
419 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idubar))) THEN
420 have_var(idubar)=.true.
421 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idru2d))) THEN
422 have_var(idru2d)=.true.
423 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvbar))) THEN
424 have_var(idvbar)=.true.
425 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idrv2d))) THEN
426 have_var(idrv2d)=.true.
427 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idkhor))) THEN
428 have_var(idkhor)=.true.
429 END IF
430#ifdef SOLVE3D
431 DO itrc=1,nt(ng)
432 IF (trim(var_name(i)).eq.trim(vname(1,idtvar(itrc)))) THEN
433 have_var(idtvar(itrc))=.true.
434# ifdef ADJUST_BOUNDARY
435 ELSE IF (any(lobc(:,istvar(itrc),ng)).and. &
436 & (trim(var_name(i)).eq. &
437 & trim(vname(1,idsbry(istvar(itrc)))))) THEN
438 have_var(idsbry(istvar(itrc)))=.true.
439# endif
440# ifdef ADJUST_STFLUX
441 ELSE IF (trim(var_name(i)).eq. &
442 & trim(vname(1,idtsur(itrc)))) THEN
443 have_var(idtsur(itrc))=.true.
444# endif
445 END IF
446 END DO
447# ifdef SEDIMENT
448 DO itrc=1,nst
449 IF (trim(var_name(i)).eq.trim(vname(1,idfrac(itrc)))) THEN
450 have_var(idfrac(itrc))=.true.
451 ELSE IF (trim(var_name(i)).eq. &
452 & trim(vname(1,idbmas(itrc)))) THEN
453 have_var(idbmas(itrc))=.true.
454# ifdef BEDLOAD
455 ELSE IF (trim(var_name(i)).eq. &
456 & trim(vname(1,idubld(itrc)))) THEN
457 have_var(idubld(itrc))=.true.
458 ELSE IF (trim(var_name(i)).eq. &
459 & trim(vname(1,idvbld(itrc)))) THEN
460 have_var(idvbld(itrc))=.true.
461# endif
462 END IF
463 END DO
464 DO itrc=1,mbedp
465 IF (trim(var_name(i)).eq.trim(vname(1,idsbed(itrc)))) THEN
466 have_var(idsbed(itrc))=.true.
467 END IF
468 END DO
469# endif
470# if defined SEDIMENT || defined BBL_MODEL
471 DO itrc=1,mbotp
472 IF (trim(var_name(i)).eq.trim(vname(1,idbott(itrc)))) THEN
473 have_var(idbott(itrc))=.true.
474 END IF
475 END DO
476# endif
477#endif
478 END DO
479!
480! Check if model state variables are available in input NetCDF file.
481!
482 IF (.not.have_var(idtime)) THEN
483 IF (master) WRITE (stdout,10) string, trim(vname(1,idtime)), &
484 & trim(ncname)
485 exit_flag=2
486 RETURN
487 END IF
488#if defined SEDIMENT && defined SED_MORPH
489 IF (.not.have_var(idbath).and.get_var(idbath)) THEN
490 IF (master) WRITE (stdout,10) string, trim(vname(1,idbath)), &
491 & trim(ncname)
492 exit_flag=2
493 RETURN
494 END IF
495#endif
496 IF (.not.have_var(idfsur).and.get_var(idfsur)) THEN
497 IF (master) WRITE (stdout,10) string, trim(vname(1,idfsur)), &
498 & trim(ncname)
499 exit_flag=2
500 RETURN
501 END IF
502#ifdef ADJUST_BOUNDARY
503 IF ((model.eq.5).or.(model.eq.6)) THEN
504 IF (.not.have_var(idsbry(isfsur)).and. &
505 & any(lobc(:,isfsur,ng)).and.get_var(idsbry(isfsur))) THEN
506 IF (master) WRITE (stdout,10) string, &
507 & trim(vname(1,idsbry(isfsur))), &
508 & trim(ncname)
509 exit_flag=2
510 RETURN
511 END IF
512 IF (.not.have_var(idsbry(isubar)).and. &
513 & any(lobc(:,isubar,ng)).and.get_var(idsbry(isubar))) THEN
514 IF (master) WRITE (stdout,10) string, &
515 & trim(vname(1,idsbry(isubar))), &
516 & trim(ncname)
517 exit_flag=2
518 RETURN
519 END IF
520 IF (.not.have_var(idsbry(isvbar)).and. &
521 & any(lobc(:,isvbar,ng)).and.get_var(idsbry(isvbar))) THEN
522 IF (master) WRITE (stdout,10) string, &
523 & trim(vname(1,idsbry(isvbar))), &
524 & trim(ncname)
525 exit_flag=2
526 RETURN
527 END IF
528# ifdef SOLVE3D
529 IF (.not.have_var(idsbry(isuvel)).and. &
530 & any(lobc(:,isuvel,ng)).and.get_var(idsbry(isuvel))) THEN
531 IF (master) WRITE (stdout,10) string, &
532 & trim(vname(1,idsbry(isuvel))), &
533 & trim(ncname)
534 exit_flag=2
535 RETURN
536 END IF
537 IF (.not.have_var(idsbry(isvvel)).and. &
538 & any(lobc(:,isvvel,ng)).and.get_var(idsbry(isvvel))) THEN
539 IF (master) WRITE (stdout,10) string, &
540 & trim(vname(1,idsbry(isvvel))), &
541 & trim(ncname)
542 exit_flag=2
543 RETURN
544 END IF
545# endif
546 END IF
547#endif
548 IF (.not.have_var(idrzet).and.get_var(idrzet)) THEN
549 IF (master) WRITE (stdout,10) string, trim(vname(1,idrzet)), &
550 & trim(ncname)
551 exit_flag=2
552 RETURN
553 END IF
554 IF (.not.have_var(idubar).and.get_var(idubar)) THEN
555 IF (master) WRITE (stdout,10) string, trim(vname(1,idubar)), &
556 & trim(ncname)
557 exit_flag=2
558 RETURN
559 END IF
560 IF (.not.have_var(idru2d).and.get_var(idru2d)) THEN
561 IF (master) WRITE (stdout,10) string, trim(vname(1,idru2d)), &
562 & trim(ncname)
563 exit_flag=2
564 RETURN
565 END IF
566 IF (.not.have_var(idvbar).and.get_var(idvbar)) THEN
567 IF (master) WRITE (stdout,10) string, trim(vname(1,idvbar)), &
568 & trim(ncname)
569 exit_flag=2
570 RETURN
571 END IF
572 IF (.not.have_var(idrv2d).and.get_var(idrv2d)) THEN
573 IF (master) WRITE (stdout,10) string, trim(vname(1,idrv2d)), &
574 & trim(ncname)
575 exit_flag=2
576 RETURN
577 END IF
578#ifdef ADJUST_WSTRESS
579 IF ((model.eq.5).or.(model.eq.6)) THEN
580 IF (.not.have_var(idusms).and.get_var(idusms)) THEN
581 IF (master) WRITE (stdout,10) string, trim(vname(1,idusms)), &
582 & trim(ncname)
583 exit_flag=2
584 RETURN
585 END IF
586 IF (.not.have_var(idvsms).and.get_var(idvsms)) THEN
587 IF (master) WRITE (stdout,10) string, trim(vname(1,idvsms)), &
588 & trim(ncname)
589 exit_flag=2
590 RETURN
591 END IF
592 END IF
593#endif
594#ifdef SOLVE3D
595 IF (.not.have_var(iduvel).and.get_var(iduvel)) THEN
596 IF (master) WRITE (stdout,10) string, trim(vname(1,iduvel)), &
597 & trim(ncname)
598 exit_flag=2
599 RETURN
600 END IF
601 IF (.not.have_var(idru3d).and.get_var(idru3d)) THEN
602 IF (master) WRITE (stdout,10) string, trim(vname(1,idru3d)), &
603 & trim(ncname)
604 exit_flag=2
605 RETURN
606 END IF
607 IF (.not.have_var(idvvel).and.get_var(idvvel)) THEN
608 IF (master) WRITE (stdout,10) string, trim(vname(1,idvvel)), &
609 & trim(ncname)
610 exit_flag=2
611 RETURN
612 END IF
613 IF (.not.have_var(idrv3d).and.get_var(idrv3d)) THEN
614 IF (master) WRITE (stdout,10) string, trim(vname(1,idrv3d)), &
615 & trim(ncname)
616 exit_flag=2
617 RETURN
618 END IF
619 DO itrc=1,nt(ng)
620 IF (.not.have_var(idtvar(itrc)).and. &
621 & get_var(idtvar(itrc))) THEN
622 IF (master) WRITE (stdout,10) string, &
623 & trim(vname(1,idtvar(itrc))), &
624 & trim(ncname)
625 exit_flag=2
626 RETURN
627 END IF
628 END DO
629# ifdef ADJUST_BOUNDARY
630 IF ((model.eq.5).or.(model.eq.6)) THEN
631 DO itrc=1,nt(ng)
632 IF (.not.have_var(idsbry(istvar(itrc))).and. &
633 & any(lobc(:,istvar(itrc),ng)).and. &
634 & get_var(idsbry(istvar(itrc)))) THEN
635 IF (master) THEN
636 WRITE (stdout,10) string, &
637 & trim(vname(1,idsbry(istvar(itrc)))), &
638 & trim(ncname)
639 exit_flag=2
640 RETURN
641 END IF
642 END IF
643 END DO
644 END IF
645# endif
646# ifdef ADJUST_STFLUX
647 IF ((model.eq.5).or.(model.eq.6)) THEN
648 DO itrc=1,nt(ng)
649 IF (.not.have_var(idtsur(itrc)).and. &
650 & get_var(idtsur(itrc)).and.lstflux(itrc,ng)) THEN
651 IF (master) WRITE (stdout,10) string, &
652 & trim(vname(1,idtsur(itrc))), &
653 & trim(ncname)
654 exit_flag=2
655 RETURN
656 END IF
657 END DO
658 END IF
659# endif
660# if defined GLS_MIXING || defined MY25_MIXING
661 IF (.not.have_var(idmtke).and.get_var(idmtke)) THEN
662 IF (master) WRITE (stdout,10) string, trim(vname(1,idmtke)), &
663 & trim(ncname)
664 exit_flag=2
665 RETURN
666 END IF
667 IF (.not.have_var(idmtls).and.get_var(idmtls)) THEN
668 IF (master) WRITE (stdout,10) string, trim(vname(1,idmtls)), &
669 & trim(ncname)
670 exit_flag=2
671 RETURN
672 END IF
673 IF (.not.have_var(idvmls).and.get_var(idvmls)) THEN
674 IF (master) WRITE (stdout,10) string, trim(vname(1,idvmls)), &
675 & trim(ncname)
676 exit_flag=2
677 RETURN
678 END IF
679 IF (.not.have_var(idvmkk).and.get_var(idvmkk)) THEN
680 IF (master) WRITE (stdout,10) string, trim(vname(1,idvmkk)), &
681 & trim(ncname)
682 exit_flag=2
683 RETURN
684 END IF
685# ifdef GLS_MIXING
686 IF (.not.have_var(idvmkp).and.get_var(idvmkp)) THEN
687 IF (master) WRITE (stdout,10) string, trim(vname(1,idvmkp)), &
688 & trim(ncname)
689 exit_flag=2
690 RETURN
691 END IF
692# endif
693# endif
694# ifdef SEDIMENT
695 DO itrc=1,nst
696 IF (.not.have_var(idfrac(itrc)).and. &
697 & get_var(idfrac(itrc))) THEN
698 IF (master) WRITE (stdout,10) string, &
699 & trim(vname(1,idfrac(itrc))), &
700 & trim(ncname)
701 exit_flag=2
702 RETURN
703 END IF
704 IF (.not.have_var(idbmas(itrc)).and. &
705 & get_var(idbmas(itrc))) THEN
706 IF (master) WRITE (stdout,10) string, &
707 & trim(vname(1,idbmas(itrc))), &
708 & trim(ncname)
709 exit_flag=2
710 RETURN
711 END IF
712# ifdef BEDLOAD
713 IF (.not.have_var(idubld(itrc)).and. &
714 & get_var(idubld(itrc))) THEN
715 IF (master) WRITE (stdout,10) string, &
716 & trim(vname(1,idubld(itrc))), &
717 & trim(ncname)
718 exit_flag=2
719 RETURN
720 END IF
721 IF (.not.have_var(idvbld(itrc)).and. &
722 & get_var(idvbld(itrc))) THEN
723 IF (master) WRITE (stdout,10) string, &
724 & trim(vname(1,idvbld(itrc))), &
725 & trim(ncname)
726 exit_flag=2
727 RETURN
728 END IF
729# endif
730 END DO
731 DO itrc=1,mbedp
732 IF (.not.have_var(idsbed(itrc)).and. &
733 & get_var(idsbed(itrc))) THEN
734 IF (master) WRITE (stdout,10) string, &
735 & trim(vname(1,idsbed(itrc))), &
736 & trim(ncname)
737 exit_flag=2
738 RETURN
739 END IF
740 END DO
741# endif
742# if defined SEDIMENT || defined BBL_MODEL
743!
744! Check only for the first four required properties, but we looked for
745! MBOTP properties above.
746!
747 DO itrc=1,4
748 IF (.not.have_var(idbott(itrc)).and. &
749 & get_var(idbott(itrc))) THEN
750 IF (master) WRITE (stdout,10) string, &
751 & trim(vname(1,idbott(itrc))), &
752 & trim(ncname)
753 exit_flag=2
754 RETURN
755 END IF
756 END DO
757# endif
758#endif
759!
760 10 FORMAT (/,a,'CHECKVARS_NF90 - unable to find model variable: ',a, &
761 & /,23x,'in file: ',a)
762!
763 RETURN
subroutine, public netcdf_check_dim(ng, model, ncname, ncid)
Definition mod_netcdf.F:538
subroutine, public netcdf_check_var(ng, model, ncname, ncid)
Definition mod_netcdf.F:723
character(len=100), dimension(mvars) var_name
Definition mod_netcdf.F:169
integer n_var
Definition mod_netcdf.F:152
integer rec_size
Definition mod_netcdf.F:156

◆ checkvars_pio()

subroutine checkvars_mod::checkvars_pio ( integer, intent(in) ng,
integer, intent(in) model,
character (len=*), intent(in) ncname,
type (file_desc_t), intent(inout) piofile,
character (len=*), intent(in) string,
integer, intent(inout) nrec,
integer, intent(in) nvar,
character (len=*), intent(inout) tvarnam,
logical, dimension(nvar), intent(out) get_var,
logical, dimension(nvar), intent(out) have_var )

Definition at line 769 of file checkvars.F.

771!***********************************************************************
772!
774!
775! Imported variable declarations.
776!
777 logical, dimension(Nvar), intent(out) :: get_var
778 logical, dimension(Nvar), intent(out) :: have_var
779!
780 integer, intent(in) :: ng, model, Nvar
781 integer, intent(inout) :: Nrec
782!
783 character (len=*), intent(in) :: ncname
784 character (len=*), intent(in) :: string
785
786 character (len=*), intent(inout) :: tvarnam
787!
788 TYPE (file_desc_t), intent(inout) :: pioFile
789!
790! Local variable declarations.
791!
792 integer :: IDmod, i, itrc
793!
794 character (len=*), parameter :: MyFile = &
795 & __FILE__//", checkvars_pio"
796!
797 sourcefile=myfile
798!
799!-----------------------------------------------------------------------
800! Determine state variables needed and check if they are available in
801! requested NetCDF file.
802!-----------------------------------------------------------------------
803!
804! Limit model identifier. The profiling is limited to iNLM, iTLM, iRPM,
805! and iADM.
806!
807 IF ((model.lt.1).or.(model.gt.4)) THEN
808 idmod=inlm
809 ELSE
810 idmod=model
811 END IF
812!
813! Inquire about the dimensions and check for consistency.
814!
815 CALL pio_netcdf_check_dim (ng, idmod, ncname, &
816 & piofile = piofile)
817 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
818 nrec=rec_size
819!
820! Inquire about the variables.
821!
822 CALL pio_netcdf_check_var (ng, idmod, ncname, &
823 & piofile = piofile)
824 IF (founderror(exit_flag, noerror, __line__, myfile)) RETURN
825!
826! Initialize logical switches.
827!
828 DO i=1,nvar
829 get_var(i)=.false.
830 have_var(i)=.false.
831 END DO
832!
833! Determine state variables to read from input NetCDF file. Notice
834! that these state variable are only assigned if input flag model < 12,
835! model = 14, or model = 15. That is, all the state variables associated
836! with ROMS prognostic equations. The remaining values are used to
837! process open boundary condition or surface forcing variable in the
838! 4D-Var control vector.
839!
840 IF ((model.le.11).or.(model.eq.14).or.(model.eq.15)) THEN
841# ifdef ANA_INITIAL
842 IF (nrrec(ng).ne.0) THEN
843 get_var(idfsur)=.true.
844 get_var(idubar)=.true.
845 get_var(idvbar)=.true.
846# ifdef SOLVE3D
847 get_var(iduvel)=.true.
848 get_var(idvvel)=.true.
849 DO itrc=1,nat
850 get_var(idtvar(itrc))=.true.
851 END DO
852# endif
853 END IF
854# else
855 get_var(idfsur)=.true.
856 IF (model.ne.7) THEN ! not needed by impulse forcing
857 get_var(idubar)=.true.
858 get_var(idvbar)=.true.
859 END IF
860# ifdef SOLVE3D
861 get_var(iduvel)=.true.
862 get_var(idvvel)=.true.
863 DO itrc=1,nat
864 get_var(idtvar(itrc))=.true.
865 END DO
866# endif
867# endif
868# ifdef SOLVE3D
869# if defined BIOLOGY
870# if defined ANA_BIOLOGY
871 IF (nrrec(ng).ne.0) THEN
872 DO itrc=1,nbt
873 get_var(idtvar(idbio(itrc)))=.true.
874 END DO
875 END IF
876# else
877 DO itrc=1,nbt
878 get_var(idtvar(idbio(itrc)))=.true.
879 END DO
880# endif
881# endif
882# if defined T_PASSIVE
883# if defined ANA_PASSIVE
884 IF (nrrec(ng).ne.0) THEN
885 DO itrc=1,npt
886 get_var(idtvar(inert(itrc)))=.true.
887 END DO
888 END IF
889# else
890 DO itrc=1,npt
891 get_var(idtvar(inert(itrc)))=.true.
892 END DO
893# endif
894# endif
895# ifdef SEDIMENT
896# ifdef ANA_SEDIMENT
897 IF (nrrec(ng).ne.0) THEN
898 DO itrc=1,nst
899 get_var(idtvar(idsed(itrc)))=.true.
900 get_var(idfrac(itrc))=.true.
901 get_var(idbmas(itrc))=.true.
902 END DO
903 DO itrc=1,mbedp
904 get_var(idsbed(itrc))=.true.
905 END DO
906 END IF
907# else
908 DO itrc=1,nst
909 get_var(idtvar(idsed(itrc)))=.true.
910 get_var(idfrac(itrc))=.true.
911 get_var(idbmas(itrc))=.true.
912 END DO
913 DO itrc=1,mbedp
914 get_var(idsbed(itrc))=.true.
915 END DO
916# endif
917# ifdef BEDLOAD
918 IF (nrrec(ng).ne.0) THEN
919 DO itrc=1,nst
920 get_var(idubld(itrc))=.true.
921 get_var(idvbld(itrc))=.true.
922 END DO
923 END IF
924# endif
925# ifdef SED_MORPH
926 IF (nrrec(ng).ne.0) THEN
927 get_var(idbath)=.true.
928 END IF
929# endif
930# endif
931# if defined SEDIMENT || defined BBL_MODEL
932# ifndef ANA_SEDIMENT
933 DO itrc=1,mbotp
934 get_var(idbott(itrc))=.true.
935 END DO
936# endif
937# endif
938# endif
939# ifdef PERFECT_RESTART
940!
941! Determine perfect restart fields to read from input NetCDF file.
942!
943 IF (((model.eq.0).or.(model.eq.inlm)).and.(nrrec(ng).ne.0)) THEN
944# ifdef SOLVE3D
945 get_var(idru3d)=.true.
946 get_var(idrv3d)=.true.
947# endif
948 get_var(idrzet)=.true.
949 get_var(idru2d)=.true.
950 get_var(idrv2d)=.true.
951# if defined GLS_MIXING || defined MY25_MIXING
952 get_var(idmtke)=.true.
953 get_var(idmtls)=.true.
954 get_var(idvmls)=.true.
955 get_var(idvmkk)=.true.
956# ifdef GLS_MIXING
957 get_var(idvmkp)=.true.
958# endif
959# endif
960 END IF
961# endif
962 END IF
963# ifdef ADJUST_BOUNDARY
964!
965! Determine 4DVar boundary variables to adjust.
966!
967 IF ((model.eq.iadm).or.(model.eq.itlm).or.(model.eq.inlm).or. &
968 & (model.eq.irpm).or.(model.eq.5).or.(model.eq.12).or. &
969 & (model.eq.16)) THEN
970 IF (any(lobc(:,isfsur,ng))) THEN
971 get_var(idsbry(isfsur))=.true.
972 END IF
973 IF (any(lobc(:,isubar,ng))) THEN
974 get_var(idsbry(isubar))=.true.
975 END IF
976 IF (any(lobc(:,isvbar,ng))) THEN
977 get_var(idsbry(isvbar))=.true.
978 END IF
979# ifdef SOLVE3D
980 IF (any(lobc(:,isuvel,ng))) THEN
981 get_var(idsbry(isuvel))=.true.
982 END IF
983 IF (any(lobc(:,isvvel,ng))) THEN
984 get_var(idsbry(isvvel))=.true.
985 END IF
986 DO itrc=1,nt(ng)
987 IF (any(lobc(:,istvar(itrc),ng))) THEN
988 get_var(idsbry(istvar(itrc)))=.true.
989 END IF
990 END DO
991# endif
992 END IF
993# endif
994# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
995!
996! Determine 4DVar surface forcing variables to adjust.
997!
998 IF ((model.eq.iadm).or.(model.eq.itlm).or.(model.eq.inlm).or. &
999 & (model.eq.irpm).or.(model.eq.5).or.(model.eq.13).or. &
1000 & (model.eq.17)) THEN
1001# ifdef ADJUST_STFLUX
1002 DO itrc=1,nt(ng)
1003 IF (lstflux(itrc,ng)) THEN
1004 get_var(idtsur(itrc))=.true.
1005 END IF
1006 END DO
1007# endif
1008# ifdef ADJUST_WSTRESS
1009 get_var(idusms)=.true.
1010 get_var(idvsms)=.true.
1011# endif
1012 END IF
1013# endif
1014!
1015! Scan variable list from input NetCDF and activate switches for
1016! model state variables.
1017!
1018 DO i=1,n_var
1019 IF (trim(var_name(i)).eq.trim(vname(1,idtime))) THEN
1020 tvarnam=trim(var_name(i))
1021 have_var(idtime)=.true.
1022# if defined SEDIMENT && defined SED_MORPH
1023 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idbath))) THEN
1024 have_var(idbath)=.true.
1025# endif
1026# ifdef ADJUST_BOUNDARY
1027 ELSE IF (any(lobc(:,isfsur,ng)).and. &
1028 & (trim(var_name(i)).eq. &
1029 & trim(vname(1,idsbry(isfsur))))) THEN
1030 have_var(idsbry(isfsur))=.true.
1031 ELSE IF (any(lobc(:,isubar,ng)).and. &
1032 & (trim(var_name(i)).eq. &
1033 & trim(vname(1,idsbry(isubar))))) THEN
1034 have_var(idsbry(isubar))=.true.
1035 ELSE IF (any(lobc(:,isvbar,ng)).and. &
1036 & (trim(var_name(i)).eq. &
1037 & trim(vname(1,idsbry(isvbar))))) THEN
1038 have_var(idsbry(isvbar))=.true.
1039# ifdef SOLVE3D
1040 ELSE IF (any(lobc(:,isuvel,ng)).and. &
1041 & (trim(var_name(i)).eq. &
1042 & trim(vname(1,idsbry(isuvel))))) THEN
1043 have_var(idsbry(isuvel))=.true.
1044 ELSE IF (any(lobc(:,isvvel,ng)).and. &
1045 & (trim(var_name(i)).eq. &
1046 & trim(vname(1,idsbry(isvvel))))) THEN
1047 have_var(idsbry(isvvel))=.true.
1048# endif
1049# endif
1050# ifdef SOLVE3D
1051 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idkver))) THEN
1052 have_var(idkver)=.true.
1053 ELSE IF (trim(var_name(i)).eq.trim(vname(1,iduvel))) THEN
1054 have_var(iduvel)=.true.
1055 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idru3d))) THEN
1056 have_var(idru3d)=.true.
1057 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvvel))) THEN
1058 have_var(idvvel)=.true.
1059 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idrv3d))) THEN
1060 have_var(idrv3d)=.true.
1061# if defined GLS_MIXING || defined MY25_MIXING || defined LMD_MIXING
1062 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvvis))) THEN
1063 have_var(idvvis)=.true.
1064 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idtdif))) THEN
1065 have_var(idtdif)=.true.
1066 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idsdif))) THEN
1067 have_var(idsdif)=.true.
1068# ifdef LMD_SKPP
1069 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idhsbl))) THEN
1070 have_var(idhsbl)=.true.
1071# endif
1072# ifdef LMD_BKPP
1073 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idhbbl))) THEN
1074 have_var(idhbbl)=.true.
1075# endif
1076# ifdef LMD_NONLOCAL
1077 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idghat(itemp)))) THEN
1078 have_var(idghat(itemp))=.true.
1079# ifdef SALINITY
1080 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idghat(isalt)))) THEN
1081 have_var(idghat(isalt))=.true.
1082# endif
1083# endif
1084# endif
1085# if defined GLS_MIXING || defined MY25_MIXING
1086 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idmtke))) THEN
1087 have_var(idmtke)=.true.
1088 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idmtls))) THEN
1089 have_var(idmtls)=.true.
1090 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvmls))) THEN
1091 have_var(idvmls)=.true.
1092 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvmkk))) THEN
1093 have_var(idvmkk)=.true.
1094# ifdef GLS_MIXING
1095 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvmkp))) THEN
1096 have_var(idvmkp)=.true.
1097# endif
1098# endif
1099# endif
1100# ifdef ADJUST_WSTRESS
1101 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idusms))) THEN
1102 have_var(idusms)=.true.
1103 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvsms))) THEN
1104 have_var(idvsms)=.true.
1105# endif
1106 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idfsur))) THEN
1107 have_var(idfsur)=.true.
1108 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idrzet))) THEN
1109 have_var(idrzet)=.true.
1110 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idubar))) THEN
1111 have_var(idubar)=.true.
1112 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idru2d))) THEN
1113 have_var(idru2d)=.true.
1114 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idvbar))) THEN
1115 have_var(idvbar)=.true.
1116 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idrv2d))) THEN
1117 have_var(idrv2d)=.true.
1118 ELSE IF (trim(var_name(i)).eq.trim(vname(1,idkhor))) THEN
1119 have_var(idkhor)=.true.
1120 END IF
1121# ifdef SOLVE3D
1122 DO itrc=1,nt(ng)
1123 IF (trim(var_name(i)).eq.trim(vname(1,idtvar(itrc)))) THEN
1124 have_var(idtvar(itrc))=.true.
1125# ifdef ADJUST_BOUNDARY
1126 ELSE IF (any(lobc(:,istvar(itrc),ng)).and. &
1127 & (trim(var_name(i)).eq. &
1128 & trim(vname(1,idsbry(istvar(itrc)))))) THEN
1129 have_var(idsbry(istvar(itrc)))=.true.
1130# endif
1131# ifdef ADJUST_STFLUX
1132 ELSE IF (trim(var_name(i)).eq. &
1133 & trim(vname(1,idtsur(itrc)))) THEN
1134 have_var(idtsur(itrc))=.true.
1135# endif
1136 END IF
1137 END DO
1138# ifdef SEDIMENT
1139 DO itrc=1,nst
1140 IF (trim(var_name(i)).eq.trim(vname(1,idfrac(itrc)))) THEN
1141 have_var(idfrac(itrc))=.true.
1142 ELSE IF (trim(var_name(i)).eq. &
1143 & trim(vname(1,idbmas(itrc)))) THEN
1144 have_var(idbmas(itrc))=.true.
1145# ifdef BEDLOAD
1146 ELSE IF (trim(var_name(i)).eq. &
1147 & trim(vname(1,idubld(itrc)))) THEN
1148 have_var(idubld(itrc))=.true.
1149 ELSE IF (trim(var_name(i)).eq. &
1150 & trim(vname(1,idvbld(itrc)))) THEN
1151 have_var(idvbld(itrc))=.true.
1152# endif
1153 END IF
1154 END DO
1155 DO itrc=1,mbedp
1156 IF (trim(var_name(i)).eq.trim(vname(1,idsbed(itrc)))) THEN
1157 have_var(idsbed(itrc))=.true.
1158 END IF
1159 END DO
1160# endif
1161# if defined SEDIMENT || defined BBL_MODEL
1162 DO itrc=1,mbotp
1163 IF (trim(var_name(i)).eq.trim(vname(1,idbott(itrc)))) THEN
1164 have_var(idbott(itrc))=.true.
1165 END IF
1166 END DO
1167# endif
1168# endif
1169 END DO
1170!
1171! Check if model state variables are available in input NetCDF file.
1172!
1173 IF (.not.have_var(idtime)) THEN
1174 IF (master) WRITE (stdout,10) string, trim(vname(1,idtime)), &
1175 & trim(ncname)
1176 exit_flag=2
1177 RETURN
1178 END IF
1179# if defined SEDIMENT && defined SED_MORPH
1180 IF (.not.have_var(idbath).and.get_var(idbath)) THEN
1181 IF (master) WRITE (stdout,10) string, trim(vname(1,idbath)), &
1182 & trim(ncname)
1183 exit_flag=2
1184 RETURN
1185 END IF
1186# endif
1187 IF (.not.have_var(idfsur).and.get_var(idfsur)) THEN
1188 IF (master) WRITE (stdout,10) string, trim(vname(1,idfsur)), &
1189 & trim(ncname)
1190 exit_flag=2
1191 RETURN
1192 END IF
1193# ifdef ADJUST_BOUNDARY
1194 IF ((model.eq.5).or.(model.eq.6)) THEN
1195 IF (.not.have_var(idsbry(isfsur)).and. &
1196 & any(lobc(:,isfsur,ng)).and.get_var(idsbry(isfsur))) THEN
1197 IF (master) WRITE (stdout,10) string, &
1198 & trim(vname(1,idsbry(isfsur))), &
1199 & trim(ncname)
1200 exit_flag=2
1201 RETURN
1202 END IF
1203 IF (.not.have_var(idsbry(isubar)).and. &
1204 & any(lobc(:,isubar,ng)).and.get_var(idsbry(isubar))) THEN
1205 IF (master) WRITE (stdout,10) string, &
1206 & trim(vname(1,idsbry(isubar))), &
1207 & trim(ncname)
1208 exit_flag=2
1209 RETURN
1210 END IF
1211 IF (.not.have_var(idsbry(isvbar)).and. &
1212 & any(lobc(:,isvbar,ng)).and.get_var(idsbry(isvbar))) THEN
1213 IF (master) WRITE (stdout,10) string, &
1214 & trim(vname(1,idsbry(isvbar))), &
1215 & trim(ncname)
1216 exit_flag=2
1217 RETURN
1218 END IF
1219# ifdef SOLVE3D
1220 IF (.not.have_var(idsbry(isuvel)).and. &
1221 & any(lobc(:,isuvel,ng)).and.get_var(idsbry(isuvel))) THEN
1222 IF (master) WRITE (stdout,10) string, &
1223 & trim(vname(1,idsbry(isuvel))), &
1224 & trim(ncname)
1225 exit_flag=2
1226 RETURN
1227 END IF
1228 IF (.not.have_var(idsbry(isvvel)).and. &
1229 & any(lobc(:,isvvel,ng)).and.get_var(idsbry(isvvel))) THEN
1230 IF (master) WRITE (stdout,10) string, &
1231 & trim(vname(1,idsbry(isvvel))), &
1232 & trim(ncname)
1233 exit_flag=2
1234 RETURN
1235 END IF
1236# endif
1237 END IF
1238# endif
1239 IF (.not.have_var(idrzet).and.get_var(idrzet)) THEN
1240 IF (master) WRITE (stdout,10) string, trim(vname(1,idrzet)), &
1241 & trim(ncname)
1242 exit_flag=2
1243 RETURN
1244 END IF
1245 IF (.not.have_var(idubar).and.get_var(idubar)) THEN
1246 IF (master) WRITE (stdout,10) string, trim(vname(1,idubar)), &
1247 & trim(ncname)
1248 exit_flag=2
1249 RETURN
1250 END IF
1251 IF (.not.have_var(idru2d).and.get_var(idru2d)) THEN
1252 IF (master) WRITE (stdout,10) string, trim(vname(1,idru2d)), &
1253 & trim(ncname)
1254 exit_flag=2
1255 RETURN
1256 END IF
1257 IF (.not.have_var(idvbar).and.get_var(idvbar)) THEN
1258 IF (master) WRITE (stdout,10) string, trim(vname(1,idvbar)), &
1259 & trim(ncname)
1260 exit_flag=2
1261 RETURN
1262 END IF
1263 IF (.not.have_var(idrv2d).and.get_var(idrv2d)) THEN
1264 IF (master) WRITE (stdout,10) string, trim(vname(1,idrv2d)), &
1265 & trim(ncname)
1266 exit_flag=2
1267 RETURN
1268 END IF
1269# ifdef ADJUST_WSTRESS
1270 IF ((model.eq.5).or.(model.eq.6)) THEN
1271 IF (.not.have_var(idusms).and.get_var(idusms)) THEN
1272 IF (master) WRITE (stdout,10) string, trim(vname(1,idusms)), &
1273 & trim(ncname)
1274 exit_flag=2
1275 RETURN
1276 END IF
1277 IF (.not.have_var(idvsms).and.get_var(idvsms)) THEN
1278 IF (master) WRITE (stdout,10) string, trim(vname(1,idvsms)), &
1279 & trim(ncname)
1280 exit_flag=2
1281 RETURN
1282 END IF
1283 END IF
1284# endif
1285# ifdef SOLVE3D
1286 IF (.not.have_var(iduvel).and.get_var(iduvel)) THEN
1287 IF (master) WRITE (stdout,10) string, trim(vname(1,iduvel)), &
1288 & trim(ncname)
1289 exit_flag=2
1290 RETURN
1291 END IF
1292 IF (.not.have_var(idru3d).and.get_var(idru3d)) THEN
1293 IF (master) WRITE (stdout,10) string, trim(vname(1,idru3d)), &
1294 & trim(ncname)
1295 exit_flag=2
1296 RETURN
1297 END IF
1298 IF (.not.have_var(idvvel).and.get_var(idvvel)) THEN
1299 IF (master) WRITE (stdout,10) string, trim(vname(1,idvvel)), &
1300 & trim(ncname)
1301 exit_flag=2
1302 RETURN
1303 END IF
1304 IF (.not.have_var(idrv3d).and.get_var(idrv3d)) THEN
1305 IF (master) WRITE (stdout,10) string, trim(vname(1,idrv3d)), &
1306 & trim(ncname)
1307 exit_flag=2
1308 RETURN
1309 END IF
1310 DO itrc=1,nt(ng)
1311 IF (.not.have_var(idtvar(itrc)).and. &
1312 & get_var(idtvar(itrc))) THEN
1313 IF (master) WRITE (stdout,10) string, &
1314 & trim(vname(1,idtvar(itrc))), &
1315 & trim(ncname)
1316 exit_flag=2
1317 RETURN
1318 END IF
1319 END DO
1320# ifdef ADJUST_BOUNDARY
1321 IF ((model.eq.5).or.(model.eq.6)) THEN
1322 DO itrc=1,nt(ng)
1323 IF (.not.have_var(idsbry(istvar(itrc))).and. &
1324 & any(lobc(:,istvar(itrc),ng)).and. &
1325 & get_var(idsbry(istvar(itrc)))) THEN
1326 IF (master) THEN
1327 WRITE (stdout,10) string, &
1328 & trim(vname(1,idsbry(istvar(itrc)))), &
1329 & trim(ncname)
1330 exit_flag=2
1331 RETURN
1332 END IF
1333 END IF
1334 END DO
1335 END IF
1336# endif
1337# ifdef ADJUST_STFLUX
1338 IF ((model.eq.5).or.(model.eq.6)) THEN
1339 DO itrc=1,nt(ng)
1340 IF (.not.have_var(idtsur(itrc)).and. &
1341 & get_var(idtsur(itrc)).and.lstflux(itrc,ng)) THEN
1342 IF (master) WRITE (stdout,10) string, &
1343 & trim(vname(1,idtsur(itrc))), &
1344 & trim(ncname)
1345 exit_flag=2
1346 RETURN
1347 END IF
1348 END DO
1349 END IF
1350# endif
1351# if defined GLS_MIXING || defined MY25_MIXING
1352 IF (.not.have_var(idmtke).and.get_var(idmtke)) THEN
1353 IF (master) WRITE (stdout,10) string, trim(vname(1,idmtke)), &
1354 & trim(ncname)
1355 exit_flag=2
1356 RETURN
1357 END IF
1358 IF (.not.have_var(idmtls).and.get_var(idmtls)) THEN
1359 IF (master) WRITE (stdout,10) string, trim(vname(1,idmtls)), &
1360 & trim(ncname)
1361 exit_flag=2
1362 RETURN
1363 END IF
1364 IF (.not.have_var(idvmls).and.get_var(idvmls)) THEN
1365 IF (master) WRITE (stdout,10) string, trim(vname(1,idvmls)), &
1366 & trim(ncname)
1367 exit_flag=2
1368 RETURN
1369 END IF
1370 IF (.not.have_var(idvmkk).and.get_var(idvmkk)) THEN
1371 IF (master) WRITE (stdout,10) string, trim(vname(1,idvmkk)), &
1372 & trim(ncname)
1373 exit_flag=2
1374 RETURN
1375 END IF
1376# ifdef GLS_MIXING
1377 IF (.not.have_var(idvmkp).and.get_var(idvmkp)) THEN
1378 IF (master) WRITE (stdout,10) string, trim(vname(1,idvmkp)), &
1379 & trim(ncname)
1380 exit_flag=2
1381 RETURN
1382 END IF
1383# endif
1384# endif
1385# ifdef SEDIMENT
1386 DO itrc=1,nst
1387 IF (.not.have_var(idfrac(itrc)).and. &
1388 & get_var(idfrac(itrc))) THEN
1389 IF (master) WRITE (stdout,10) string, &
1390 & trim(vname(1,idfrac(itrc))), &
1391 & trim(ncname)
1392 exit_flag=2
1393 RETURN
1394 END IF
1395 IF (.not.have_var(idbmas(itrc)).and. &
1396 & get_var(idbmas(itrc))) THEN
1397 IF (master) WRITE (stdout,10) string, &
1398 & trim(vname(1,idbmas(itrc))), &
1399 & trim(ncname)
1400 exit_flag=2
1401 RETURN
1402 END IF
1403# ifdef BEDLOAD
1404 IF (.not.have_var(idubld(itrc)).and. &
1405 & get_var(idubld(itrc))) THEN
1406 IF (master) WRITE (stdout,10) string, &
1407 & trim(vname(1,idubld(itrc))), &
1408 & trim(ncname)
1409 exit_flag=2
1410 RETURN
1411 END IF
1412 IF (.not.have_var(idvbld(itrc)).and. &
1413 & get_var(idvbld(itrc))) THEN
1414 IF (master) WRITE (stdout,10) string, &
1415 & trim(vname(1,idvbld(itrc))), &
1416 & trim(ncname)
1417 exit_flag=2
1418 RETURN
1419 END IF
1420# endif
1421 END DO
1422 DO itrc=1,mbedp
1423 IF (.not.have_var(idsbed(itrc)).and. &
1424 & get_var(idsbed(itrc))) THEN
1425 IF (master) WRITE (stdout,10) string, &
1426 & trim(vname(1,idsbed(itrc))), &
1427 & trim(ncname)
1428 exit_flag=2
1429 RETURN
1430 END IF
1431 END DO
1432# endif
1433# if defined SEDIMENT || defined BBL_MODEL
1434!
1435! Check only for the first four required properties, but we looked for
1436! MBOTP properties above.
1437!
1438 DO itrc=1,4
1439 IF (.not.have_var(idbott(itrc)).and. &
1440 & get_var(idbott(itrc))) THEN
1441 IF (master) WRITE (stdout,10) string, &
1442 & trim(vname(1,idbott(itrc))), &
1443 & trim(ncname)
1444 exit_flag=2
1445 RETURN
1446 END IF
1447 END DO
1448# endif
1449# endif
1450!
1451 10 FORMAT (/,a,'CHECKVARS_PIO - unable to find model variable: ',a, &
1452 & /,22x,'in file: ',a)
1453!
1454 RETURN
subroutine, public pio_netcdf_check_var(ng, model, ncname, piofile)
subroutine, public pio_netcdf_check_dim(ng, model, ncname, piofile)