My Project
mod_ncdio.f90
Go to the documentation of this file.
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 !/===========================================================================/
13 ! Copyright (c) 2007, The University of Massachusetts Dartmouth
14 ! Produced at the School of Marine Science & Technology
15 ! Marine Ecosystem Dynamics Modeling group
16 ! All rights reserved.
17 !
18 ! FVCOM has been developed by the joint UMASSD-WHOI research team. For
19 ! details of authorship and attribution of credit please see the FVCOM
20 ! technical manual or contact the MEDM group.
21 !
22 !
23 ! This file is part of FVCOM. For details, see http://fvcom.smast.umassd.edu
24 ! The full copyright notice is contained in the file COPYRIGHT located in the
25 ! root directory of the FVCOM code. This original header must be maintained
26 ! in all distributed versions.
27 !
28 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29 ! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30 ! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31 ! PURPOSE ARE DISCLAIMED.
32 !
33 !/---------------------------------------------------------------------------/
34 ! CVS VERSION INFORMATION
35 ! $Id$
36 ! $Name$
37 ! $Revision$
38 !/===========================================================================/
39 
40 MODULE mod_ncdio
41  !==============================================================================!
42  ! NetCDF Io for FVCOM using CF Metadata Convention !
43  ! !
44  ! see: http://www.cgd.ucar.edu/cms/eaton/cf-metadata/ for info !
45  ! !
46  ! current time dependent variables set up !
47  ! el: surface elevation !
48  ! u: x-velocity. In spherical coordinate,lon-velocity !
49  ! v: y-velocity. In spherical coordinate,lat-velocity !
50  ! ww: z-velocity !
51  ! kh: turbulent diffusivity !
52  ! km: turbulent viscosity !
53  ! t1: temperature !
54  ! s1: salinity !
55  ! ua: vertically-averaged x-velocity !
56  ! In spherical coordinate,vertically-averaged lon-velocity !
57  ! va: vertically-averaged y-velocity !
58  ! In spherical coordinate,vertically-averaged lat-velocity !
59  ! d: depth at procs !
60  ! dye: dye at procs !
61  ! aice: ice concentration on procs !
62  ! vice: ice thichness on procs !
63  ! uuice: ice x-velocity !
64  ! vvice: ice y-velocity !
65  ! uuwind: wind speed in x direction !
66  ! vvwind: wind speed in y direction !
67  ! pa_air: sea level atmospheric pressure !
68  ! !
69  ! wd: wet/dry flag (0 or 1) !
70  ! !
71  ! vort: vorticity !
72  ! to add additional variables: !
73  ! 1.) add to list above !
74  ! 2.) add *_vid to variables vid in section "new variable vid" !
75  ! 3.) go to definition section "new variable definition" !
76  ! 4.) add io section "new variable io" !
77  !==============================================================================!
78 
79 ! For Unstructred CF standard file - beta test!
80 !# define UCF
81 
82  USE all_vars
83  USE mod_prec
84  USE mod_nctools
85  USE mod_utils
86  USE mod_time
87  USE mod_input
88 
89 
90 
91 
92 
93 
94  implicit none
95 
96 !# if defined(UCF)
97 ! ATT => NC_MAKE_ATT(name='grid',values='')
98 ! VAR => ADD(VAR,ATT)
99 !
100 ! ATT => NC_MAKE_ATT(name='grid_location',values='')
101 ! VAR => ADD(VAR,ATT)
102 !# endif
103 
104 
105  LOGICAL :: visit_cmd_dump
106  LOGICAL :: ncnest_cmd_dump
107 
108 
109  Character(LEN=50) :: coordvar
110 
111  LOGICAL, private :: found
112  logical, private :: need_init = .true.
113 
114  TYPE(ncdim), POINTER :: dim_nele
115  TYPE(ncdim), POINTER :: dim_node
116  TYPE(ncdim), POINTER :: dim_three
117  TYPE(ncdim), POINTER :: dim_four
118 
119  TYPE(ncdim), POINTER :: dim_siglay
120  TYPE(ncdim), POINTER :: dim_siglev
121 
122 
123  TYPE(ncdim), POINTER :: dim_time
124  TYPE(ncdim), POINTER :: dim_datestrlen
125 
126  TYPE(ncdim), POINTER :: dim_nobc
127  TYPE(ncdim), POINTER :: dim_nlsf
128 
129  TYPE(ncdim), POINTER :: dim_maxnode
130  TYPE(ncdim), POINTER :: dim_maxelem
131 
132  TYPE(ncdim), POINTER :: dim_grid
133  TYPE(ncdim), POINTER :: dim_ncat
134  TYPE(ncdim), POINTER :: dim_ntilay
135 
136 
137  ! FILE POINTERS FOR NETCDF AVERAGE OUTPUT
138  TYPE(ncfile), POINTER :: nc_avg_data
139  TYPE(ncfile), POINTER :: nc_avg_sum
140 
141 
142  ! GRID TYPES FOR DATA AND AVERAGE OUTPUT
143  TYPE(grid), POINTER :: nc_dat_grids(:)
144 
145  TYPE(grid), POINTER :: nc_avg_grids(:)
146 
147 
148  save
149 
150 CONTAINS
151 !=============================================================
152  SUBROUTINE archive
153  IMPLICIT NONE
154 
155  INTEGER :: STATUS
156  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START ARCHIVE"
157 
158 
159  if(need_init) then
160  IF(use_mpi_io_mode) THEN
162  ELSE
163  CALL call_func(init_code,status)
164  IF (status/=0) call fatal_error("ARCHIVE:: Bad INIT_CODE",&
165  & "Could not retrieve valid function pointer?")
166  END IF
167 
168  need_init = .false.
169  visit_cmd_dump = .false.
170  end if
171 
172  ncnest_cmd_dump = .false.
173 
174  IF(nc_on)THEN
175  ! bounds checking
176  !IF(NC_DAT%FTIME%NEXT_IO == IntTime .or. FORCE_ARCHIVE) THEN
177  IF(abs(nc_dat%FTIME%NEXT_IO -inttime)<0.1_sp*imdti .or. force_archive) THEN
178 
179  IF(use_mpi_io_mode) THEN
181  ELSE
182  CALL call_func(nc_code,status)
183  IF (status/=0) call fatal_error("ARCHIVE:: Bad NC_CODE",&
184  & "Could not retrieve valid function pointer?")
185  END IF
186  END IF
187  END IF
188 
189 
190  IF(ncav_on)THEN
191 
192 ! !qxu IF(NC_AVG%FTIME%NEXT_IO < IntTime) CALL ADD_AVERAGE
193 ! IF(NC_AVG%FTIME%PREV_IO < IntTime) CALL ADD_AVERAGE
194 ! write(*,*) 'NC_AVG%FTIME%PREV_IO=',NC_AVG%FTIME%PREV_IO
195 ! write(*,*) ' IntTime=',IntTime
196 ! !CALL ADD_AVERAGE
197 ! !IF((NC_AVG%FTIME%NEXT_IO + NC_AVG%FTIME%INTERVAL) == IntTime)THEN
198 ! !DAS{ ADD for AVG TIMES
199 ! !IF(abs(NC_AVG%FTIME%NEXT_IO + NC_AVG%FTIME%INTERVAL-IntTime)<0.1_SP*IMDTI)THEN
200 ! IF(abs(NC_AVG%FTIME%NEXT_IO -IntTime)<0.1_SP*IMDTI)THEN
201 ! !DAS}
202 ! CALL DIVIDE_AVERAGE
203 !
204 ! IF(USE_MPI_IO_MODE) THEN
205 ! CALL MPI_IO_SYNCHRONIZE(NCAV_CODE)
206 ! ELSE
207 ! CALL CALL_FUNC(NCAV_CODE,status)
208 ! IF (status/=0) call fatal_error("ARCHIVE:: Bad NCAV_CODE",&
209 ! & "Could not retrieve valid function pointer?")
210 ! END IF
211 !
212 ! CALL ZERO_AVERAGE
213 !
214 ! END IF
215 
216 
217  ! Start averaging data at Next_IO
218  IF(nc_avg%FTIME%NEXT_IO < inttime) CALL add_average
219  write(*,*) 'NC_AVG%FTIME%NEXT_IO=',nc_avg%FTIME%NEXT_IO
220  write(*,*) ' IntTime=',inttime
221 
222  ! When average interval is complete - write to file
223  IF((nc_avg%FTIME%NEXT_IO + nc_avg%FTIME%INTERVAL) == inttime)THEN
224 
225  CALL divide_average
226 
227  IF(use_mpi_io_mode) THEN
229  ELSE
230  CALL call_func(ncav_code,status)
231  IF (status/=0) call fatal_error("ARCHIVE:: Bad NCAV_CODE",&
232  & "Could not retrieve valid function pointer?")
233  END IF
234 
235  CALL zero_average
236 
237  END IF
238  END IF
239 
240  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END AVG ARCHIVE"
241 
242  IF(rst_on)THEN
243  !IF(NC_RST%FTIME%NEXT_IO == IntTime .or.VISIT_CMD_DUMP) then
244  IF(abs(nc_rst%FTIME%NEXT_IO-inttime)<0.1_sp*imdti .or.visit_cmd_dump) then
245 
246  visit_cmd_dump = .false.
247 
248  ncnest_cmd_dump = .true.
249 
250  IF(use_mpi_io_mode) THEN
252  ELSE
253  CALL call_func(restart_code,status)
254  IF (status/=0) call fatal_error("ARCHIVE:: Bad RESTART_CODE",&
255  & "Could not retrieve valid function pointer?")
256  END IF
257  END IF
258  END IF
259 
260  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END ARCHIVE"
261  END SUBROUTINE archive
262 !=============================================================
263  SUBROUTINE init_ncdio
264  IMPLICIT NONE
265 
266  IF(dbg_set(dbg_log)) THEN
267 
268  write(ipt,*)"!=============================================================="
269  write(ipt,*)"! SETTING UP NCDIO: CREATING AND DUMPING OUTPUT FILE META DATA"
270  write(ipt,*)"!=============================================================="
271  END IF
272 
273  ! DEFINE DIMENSIONS HERE - THEY ARE KILLED AT THE END OF THIS
274  ! SETUP SCRIPT...
275 
276  coordvar="x y"
277 
278 
279  IF(nc_on) then
280 
281  IF(.not. ASSOCIATED(nc_dat)) Call fatal_error &
282  & ("INIT_NCDIO: THE DATA FILE OBJECT IS NOT ASSOCIATED ")
283 
284  CALL setup_datfile
285 
286 
287  END IF
288 
289  IF(ncav_on) then
290 
291  IF(.not. ASSOCIATED(nc_avg)) Call fatal_error &
292  & ("INIT_NCDIO: THE AVERAGE FILE OBJECT IS NOT ASSOCIATED ")
293 
294 
295  CALL setup_avgfile
296  END IF
297 
298  IF(rst_on) then
299 
300 
301  IF(.not. ASSOCIATED(nc_rst)) Call fatal_error &
302  & ("INIT_NCDIO: THE RESTART FILE OBJECT IS NOT ASSOCIATED ")
303 
304  CALL setup_rstfile
305  END IF
306 
307  IF(dbg_set(dbg_log)) THEN
308 
309 
310  write(ipt,*)"! FINISHED NCDIO SETUP!"
311  write(ipt,*)"!=============================================================="
312  END IF
313 
314 
315  END SUBROUTINE init_ncdio
316 !=============================================================
317 ! NEED AN INTERFACE WITH NO ARGS FOR FUNCTION POINTERS
318 !=============================================================
319  SUBROUTINE dump_nc_dat
320  IMPLICIT NONE
321  INTEGER :: I
322  TYPE(ncfile), POINTER :: NCF
323  LOGICAL :: FOUND
324 
325 
326  IF (icing_model .AND. .NOT. ioproc) CALL icing(inttime)
327 
328  DO i = 1, SIZE(nc_dat_grids)
329 
330  ncf => find_file(filehead,nc_dat_grids(i)%NAME,found)
331  IF(.NOT.found) CALL fatal_error&
332  ("DUMP_NC_DAT: CAN NOT FILE FILE OBJECT NAME:"//trim(nc_dat_grids(i)%NAME))
333 
334  CALL dump_data(ncf)
335 
336  ! INCASE THE NAME WAS CHANGED INSIDE DUMP_DATA
337  nc_dat_grids(i)%NAME = ncf%FNAME
338 
339  END DO
340 
341  END SUBROUTINE dump_nc_dat
342  !=============================================================
343  SUBROUTINE dump_nc_avg
344  IMPLICIT NONE
345  INTEGER :: I
346  TYPE(ncfile), POINTER :: NCF
347  LOGICAL :: FOUND
348 
349  DO i = 1, SIZE(nc_avg_grids)
350 
351  ncf => find_file(filehead,nc_avg_grids(i)%NAME,found)
352  IF(.NOT.found) CALL fatal_error&
353  ("DUMP_NC_AVG: CAN NOT FILE FILE OBJECT NAME:"//trim(nc_avg_grids(i)%NAME))
354 
355  CALL dump_data(ncf)
356 
357  ! INCASE THE NAME WAS CHANGED INSIDE DUMP_DATA
358  nc_avg_grids(i)%NAME = ncf%FNAME
359 
360  END DO
361 
362  END SUBROUTINE dump_nc_avg
363  !=============================================================
364  SUBROUTINE dump_nc_rst
365  IMPLICIT NONE
366  CALL dump_data(nc_rst)
367  END SUBROUTINE dump_nc_rst
368 !=============================================================
369  SUBROUTINE setup_datfile
370  IMPLICIT NONE
371  character(len=80) :: tmp,dat_name
372  INTEGER :: NUMG, I
373 
374  TYPE(ncfile), POINTER :: NCF,NCF_TMP,NCF2
375 
376  LOGICAL :: INCLUDE_MASTER = .false.
377 
378  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START SETUP_DATAFILE"
379 
380  IF(dbg_set(dbg_log)) THEN
381 
382  write(ipt,*)"!--------------------------------------------------"
383  write(ipt,*)"! SETTING UP DATA FILE OUTPUTS..."
384  END IF
385 
386 
387  ! Get the suffix from the NC_DAT file
388  i = len_trim(nc_dat%FNAME)
389  dat_name = nc_dat%FNAME(i-7:i)
390 
391 
392  CALL setup_subdomains(nc_subdomain_files,nc_dat_grids)
393 
394  numg = size(nc_dat_grids)
395 
396  DO i = 1, numg
397 
398  ! DEFINEN DIMENSIONS FOR THIS GRID
400 
401  IF(nc_dat_grids(i)%NAME /="FVCOM") THEN
402  ! MAKE NEW FILE OBJECT
403  tmp = trim(output_dir)//trim(nc_dat_grids(i)%NAME)//trim(dat_name)
404  ncf => new_file(trim(tmp))
405 
406  ! SET THE CURRENT NAME IN THE GRID OBJECT
407  nc_dat_grids(i)%NAME=ncf%FNAME
408 
409  ! SET THE FTIME OBJECT
410  ncf%FTIME => new_ftime()
411  ncf%FTIME = nc_dat%FTIME
412 
413  ! MAKE A TEMPORARY POINTER TO ADD THE FILE TO THE LIST
414  ncf_tmp => ncf
415  filehead => add(filehead,ncf_tmp)
416 
417  ELSE
418  ! THIS IS THE FVCOM GRID FILE
419  ncf => nc_dat
420  nc_dat_grids(i)%NAME = nc_dat%FNAME
421  include_master = .true.
422  END IF
423 
424 
425 
426 
427  ! ADD THE DATA OBJECTS
428  ncf2 => grid_file_object(nc_dat_grids(i))
429  ncf => add(ncf,ncf2)
430 !!$ NCF => ADD(NCF,GRID_FILE_OBJECT(NC_DAT_GRIDS(I)) )
431 
432  ncf2 => time_file_object()
433  ncf => add(ncf,ncf2)
434 !!$ NCF => ADD(NCF,TIME_FILE_OBJECT() )
435 
436  ncf2 => zeta_file_object()
437  ncf => add(ncf,ncf2)
438 !!$ NCF => ADD(NCF,ZETA_FILE_OBJECT() )
439 
440  IF(nc_file_date) THEN
441  ncf2 => file_date_object()
442  ncf => add(ncf,ncf2)
443 !!$ NCF => ADD(NCF,FILE_DATE_OBJECT() )
444  END IF
445 
446  IF(nc_grid_metrics) THEN
448  ncf => add(ncf,ncf2)
449 !!$ NCF => ADD(NCF,GRID_METRICS_FILE_OBJECT(NC_DAT_GRIDS(I)) )
450  END IF
451 
452  IF(nc_velocity) THEN
453  ncf2 => velocity_file_object()
454  ncf => add(ncf,ncf2)
455 !!$ NCF => ADD(NCF,VELOCITY_FILE_OBJECT() )
456  END IF
457 
458  IF(nc_vertical_vel) THEN
459  ncf2 => vertical_vel_file_object()
460  ncf => add(ncf,ncf2)
461 !!$ NCF => ADD(NCF,VERTICAL_VEL_FILE_OBJECT() )
462  END IF
463 
464  IF(nc_average_vel) THEN
465  ncf2 => average_vel_file_object()
466  ncf => add(ncf,ncf2)
467 !!$ NCF => ADD(NCF,AVERAGE_VEL_FILE_OBJECT() )
468  END IF
469 
470  IF(nc_vorticity) THEN
471  ncf2 => vorticity_file_object()
472  ncf => add(ncf,ncf2)
473 !!$ NCF => ADD(NCF,VORTICITY_FILE_OBJECT() )
474  END IF
475 
476  IF(nc_salt_temp) THEN
477  ncf2 => salt_temp_file_object()
478  ncf => add(ncf,ncf2)
479 !!$ NCF => ADD(NCF,SALT_TEMP_FILE_OBJECT() )
480  END IF
481 
482  IF(nc_turbulence) THEN
483  ncf2 => turbulence_file_object()
484  ncf => add(ncf,ncf2)
485 !!$ NCF => ADD(NCF,TURBULENCE_FILE_OBJECT() )
486  END IF
487 
488  IF (nc_surface_heat .and. heating_on) THEN
490  ncf => add(ncf,ncf2)
491 !!$ NCF => ADD(NCF,SURFACE_HEATING_FILE_OBJECT() )
492  END IF
493 
494  IF (nc_wind_vel) THEN
495  ncf2 => wind_velocity_file_object()
496  ncf => add(ncf,ncf2)
497 !!$ NCF => ADD(NCF,WIND_VELOCITY_FILE_OBJECT() )
498  END IF
499 
500  IF (nc_wind_stress .and. wind_on) THEN
501  ncf2 => wind_stress_file_object()
502  ncf => add(ncf,ncf2)
503 !!$ NCF => ADD(NCF,WIND_STRESS_FILE_OBJECT() )
504  END IF
505 
506 
507  IF (nc_evap_precip .and. precipitation_on) THEN
508  ncf2 => precipitation_file_object()
509  ncf => add(ncf,ncf2)
510 !!$ NCF => ADD(NCF,PRECIPITATION_FILE_OBJECT() )
511  END IF
512 
513  IF(wetting_drying_on) THEN
514  ncf2 => wet_dry_file_object()
515  ncf => add(ncf, ncf2)
516 !!$ NCF => ADD(NCF, WET_DRY_FILE_OBJECT() )
517  END IF
518 
519  IF(icing_model) THEN
520  ncf2 => icing_file_object()
521  ncf => add(ncf, ncf2)
522 !!$ NCF => ADD(NCF, ICING_FILE_OBJECT() )
523  END IF
524 
525  IF (groundwater_on .and. nc_groundwater) THEN
526  ncf2 => groundwater_file_object()
527  ncf => add(ncf,ncf2)
528 !!$ NCF => ADD(NCF,GROUNDWATER_FILE_OBJECT() )
529  END IF
530 
531 
532 
533 
534 
535 
536 
537 
538  IF (startup_type /= "crashrestart") THEN
539 
540  ! IF CRASH RESTART - OVER RIDE THE STKCNT
541  ncf%FTIME%NEXT_STKCNT = 0
542  CALL nc_write_file(ncf)
543  ncf%FTIME%NEXT_STKCNT = 1
544 
545  ELSE
546  ncf%CONNECTED = .true.
547  ncf%WRITABLE = .true.
548  END IF
549 
550 
551  CALL kill_dimensions
552  END DO
553 
554  IF(.not. include_master) THEN
555 
556  CALL kill_file(nc_dat)
557  nc_dat => find_file(filehead,nc_dat_grids(1)%NAME,found)
558 
559  IF(.NOT. found) CALL fatal_error&
560  &("LOGICAL ERROR IN SETUP_DATFILE")
561  END IF
562 
563  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END SETUP_DATAFILE"
564  END SUBROUTINE setup_datfile
565 !=============================================================
566  SUBROUTINE setup_avgfile
567  IMPLICIT NONE
568  character(len=80) :: tmp,dat_name
569  TYPE(ncvar),POINTER :: VAR
570  TYPE(ncatt),POINTER :: ATT
571  TYPE(ncdim),POINTER :: DIM
572  LOGICAL :: FOUND
573  INTEGER :: NUMG, I
574  TYPE(grid), SAVE :: MYGRID
575  TYPE(ncfile), POINTER :: NCF,NCF_TMP
576  LOGICAL :: INCLUDE_MASTER = .false.
577 
578 
579  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START SETUP_AVGFILE"
580 
581  !===================================================================
582  ! MAKE A FILE TO HOLD POINTERS TO ALL VARIABLES THAT WILL BE AVERAGED
583  !===================================================================
584 
585  IF(dbg_set(dbg_log)) THEN
586 
587  write(ipt,*)"!--------------------------------------------------"
588  write(ipt,*)"! SETTING UP AVERAGE FILE OUTPUTS..."
589  END IF
590 
591  CALL set_fvcom_grid(mygrid)
592 
593  CALL define_dimensions(mygrid)
594 
595  nc_avg_data => new_file()
596 
597  ncf_tmp => zeta_file_object()
598  nc_avg_data => add(nc_avg_data,ncf_tmp)
599 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,ZETA_FILE_OBJECT() )
600 
601  ! NOW ADD THE OTHER DATA VARIABLES TO THE AVG FILE
602  IF(ncav_velocity) THEN
603  ncf_tmp => velocity_file_object()
604  nc_avg_data => add(nc_avg_data,ncf_tmp)
605 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,VELOCITY_FILE_OBJECT() )
606  END IF
607 
608  IF(ncav_vertical_vel) THEN
609  ncf_tmp => vertical_vel_file_object()
610  nc_avg_data => add(nc_avg_data,ncf_tmp)
611 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,VERTICAL_VEL_FILE_OBJECT() )
612  END IF
613 
614  IF(ncav_average_vel) THEN
615  ncf_tmp => average_vel_file_object()
616  nc_avg_data => add(nc_avg_data,ncf_tmp)
617 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,AVERAGE_VEL_FILE_OBJECT() )
618  END IF
619 
620  IF(ncav_vorticity) THEN
621  ncf_tmp => vorticity_file_object()
622  nc_avg_data => add(nc_avg_data,ncf_tmp)
623 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,VORTICITY_FILE_OBJECT() )
624  END IF
625 
626  IF(ncav_salt_temp) THEN
627  ncf_tmp => salt_temp_file_object()
628  nc_avg_data => add(nc_avg_data,ncf_tmp)
629 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,SALT_TEMP_FILE_OBJECT() )
630  END IF
631 
632  IF(ncav_turbulence) THEN
633  ncf_tmp => turbulence_file_object()
634  nc_avg_data => add(nc_avg_data,ncf_tmp)
635 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,TURBULENCE_FILE_OBJECT() )
636  END IF
637 
638  IF (ncav_surface_heat .and. heating_on) THEN
639  ncf_tmp => surface_heating_file_object()
640  nc_avg_data => add(nc_avg_data,ncf_tmp)
641  !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,SURFACE_HEATING_FILE_OBJECT() )
642  END IF
643 
644  IF (ncav_wind_vel) THEN
645  ncf_tmp => wind_velocity_file_object()
646  nc_avg_data => add(nc_avg_data,ncf_tmp)
647 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,WIND_VELOCITY_FILE_OBJECT() )
648  END IF
649 
650  IF (ncav_wind_stress .and. wind_on) THEN
651  ncf_tmp => wind_stress_file_object()
652  nc_avg_data => add(nc_avg_data,ncf_tmp)
653 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,WIND_STRESS_FILE_OBJECT() )
654  END IF
655 
656 
657  IF (ncav_evap_precip .and. precipitation_on) THEN
658  ncf_tmp => precipitation_file_object()
659  nc_avg_data => add(nc_avg_data,ncf_tmp)
660 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,PRECIPITATION_FILE_OBJECT() )
661  END IF
662 
663 ! IF(WETTING_DRYING_ON) THEN
664 ! NC_AVG_DATA => ADD(NC_AVG_DATA, WET_DRY_FILE_OBJECT() )
665 ! END IF
666 
667 ! IF(ICING_MODEL) THEN
668 ! NC_AVG_DATA => ADD(NC_AVG_DATA, ICING_FILE_OBJECT() )
669 ! END IF
670 
671  IF (groundwater_on .and. ncav_groundwater) THEN
672  ncf_tmp => groundwater_file_object()
673  nc_avg_data => add(nc_avg_data,ncf_tmp)
674 !!$ NC_AVG_DATA => ADD(NC_AVG_DATA,GROUNDWATER_FILE_OBJECT() )
675  END IF
676 
677 
678 
679 
680 
681 
682 
683 
684 
685  !===================================================================
686  ! MAKE A COPY OF THE DATA POINTER FILE TO IN WHICH TO DO THE SUM
687  !===================================================================
688  nc_avg_sum => copy_file(nc_avg_data)
689 
690  !===================================================================
691  ! ALLOCATE ALL ITS DATA POINTERS TO MAKE THE EXTRA STORAGE
692  !===================================================================
693  CALL allocate_associated_vars(nc_avg_sum)
694 
695 
696  CALL kill_dimensions
697 
698 
699 
700  !===================================================================
701  ! NOW MAKE THE ACTUAL FILES WHICH ARE WRITTEN TO DISK
702  !===================================================================
703 
704  ! Get the suffix from the NC_DAT file
705  i = len_trim(nc_avg%FNAME)
706  dat_name = nc_avg%FNAME(i-11:i)
707 
708  ! SETUP THE SUBDOMAIN FILES AND MAPS
709  CALL setup_subdomains(ncav_subdomain_files,nc_avg_grids)
710 
711  numg = size(nc_avg_grids)
712 
713  ! FOR EACH SUBDOMAIN MAKE THE FILE
714  DO i = 1, numg
715 
716  ! DEFINEN DIMENSIONS FOR THIS GRID
718 
719  IF(nc_avg_grids(i)%NAME /="FVCOM") THEN
720  ! MAKE NEW FILE OBJECT
721  tmp = trim(nc_avg_grids(i)%NAME)//trim(dat_name)
722  ncf => new_file(trim(tmp))
723 
724  ! SET THE CURRENT NAME IN THE GRID OBJECT
725  nc_avg_grids(i)%NAME=ncf%FNAME
726 
727  ! SET THE FTIME OBJECT
728  ncf%FTIME => new_ftime()
729  ncf%FTIME = nc_avg%FTIME
730 
731  ! MAKE A TEMPORARY POINTER TO ADD THE FILE TO THE LIST
732  ncf_tmp => ncf
733  filehead => add(filehead,ncf_tmp)
734 
735  ELSE
736  ! THIS IS THE AVERAGE FVCOM GRID FILE
737  ncf => nc_avg
738  nc_avg_grids(i)%NAME = nc_avg%FNAME
739 
740  include_master = .true.
741  END IF
742 
743 
744 
745  ! ADD THE GRID STUFF THAT DOES NOT COME FROM THE AVERAGE DATA
746  ncf_tmp => grid_file_object(nc_avg_grids(i))
747  ncf => add(ncf,ncf_tmp)
748 !!$ NCF => ADD(NCF,GRID_FILE_OBJECT(NC_AVG_GRIDS(I)) )
749 
750  ncf_tmp => time_file_object()
751  ncf => add(ncf,ncf_tmp)
752 !!$ NCF => ADD(NCF,TIME_FILE_OBJECT() )
753 
754  att => find_att(ncf,"title",found)
755  att%CHR(1) = trim(case_title)//"; Average output file!"
756  NULLIFY(att)
757 
758  IF(ncav_file_date) THEN
759  ncf_tmp => file_date_object()
760  ncf => add(ncf,ncf_tmp)
761 !!$ NCF => ADD(NCF,FILE_DATE_OBJECT() )
762  END IF
763 
764  IF(ncav_grid_metrics) THEN
766  ncf => add(ncf,ncf_tmp)
767 !!$ NCF => ADD(NCF,GRID_METRICS_FILE_OBJECT(NC_AVG_GRIDS(I)) )
768  END IF
769 
770 
771  ! MAKE A COPY OF THE FILE POINTER TO ADD TO THE ACTUAL FILE
772  ! THIS COPY POINTS TO THE MEMORY WHICH CONTAINS THE SUM/AVERAGE
773  ncf_tmp =>copy_file(nc_avg_sum)
774 
775  ! ADJUST THE NODE AND NELE DIMENSION OF THE COPIED FILE TO
776  ! MATCH THE NEW FILE
777 
778  dim => find_dim(ncf_tmp,'node',found)
779  IF(.not.found) CALL fatal_error&
780  &("LOGICAL ERROR IN SETUP_AVGFILE: CAN'T FIND DIM NODE")
781  dim%DIM = nc_avg_grids(i)%MGL
782 
783  dim => find_dim(ncf_tmp,'nele',found)
784  IF(.not.found) CALL fatal_error&
785  &("LOGICAL ERROR IN SETUP_AVGFILE: CAN'T FIND DIM NELE")
786  dim%DIM = nc_avg_grids(i)%NGL
787 
788 
789  ncf => add(ncf,ncf_tmp)
790 
791 
792  IF (startup_type /= "crashrestart") THEN
793 
794  ! IF NOT CRASH RESTART - OVER RIDE THE STKCNT
795  ncf%FTIME%NEXT_STKCNT = 0
796  CALL nc_write_file(ncf)
797  ncf%FTIME%NEXT_STKCNT = 1
798 
799  ELSE
800  ncf%CONNECTED = .true.
801  ncf%WRITABLE = .true.
802  END IF
803 
804  CALL kill_dimensions
805 
806 
807  END DO
808 
809 
810  IF(.not. include_master) THEN
811 
812  CALL kill_file(nc_avg)
813  nc_avg => find_file(filehead,nc_avg_grids(1)%NAME,found)
814 
815  IF(.NOT. found) CALL fatal_error&
816  &("LOGICAL ERROR IN SETUP_AVGFILE")
817  END IF
818 
819 
820  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END SETUP_AVGFILE"
821  END SUBROUTINE setup_avgfile
822 !============================================================
823  SUBROUTINE add_average
824  IMPLICIT NONE
825 
826  TYPE(ncvarp),POINTER :: CURRENT_DATA,CURRENT_SUM
827  TYPE(ncvar),POINTER :: VAR_DATA, VAR_SUM
828 
829  current_data => nc_avg_data%VARS%NEXT
830  current_sum => nc_avg_sum%VARS%NEXT
831 
832  DO
833  IF(.NOT. ASSOCIATED(current_data)) THEN
834  EXIT ! END OF VAR LIST
835  END IF
836 
837  IF(.NOT. ASSOCIATED(current_sum)) THEN
838  CALL fatal_error("ADD_AVERAGE: SUM AND DATA VAR LISTS DO NOT HAVE THE SAME LENGTH?")
839  END IF
840 
841  IF(.NOT. ASSOCIATED(current_sum%VAR)) THEN
842  CALL fatal_error("ALLOCATE_ASSOCIATED_VARS: FOUND NULL VAR POINTER IN THE LIST")
843  END IF
844 
845  IF(.NOT. ASSOCIATED(current_data%VAR)) THEN
846  CALL fatal_error("ALLOCATE_ASSOCIATED_VARS: FOUND NULL VAR POINTER IN THE LIST")
847  END IF
848 
849  var_sum => current_sum%VAR
850  var_data => current_data%VAR
851 
852 
853  IF(Associated(var_data%SCL_INT)) var_sum%SCL_INT=var_data%SCL_INT+var_sum%SCL_INT
854  IF(Associated(var_data%VEC_INT)) var_sum%VEC_INT=var_data%VEC_INT+var_sum%VEC_INT
855  IF(Associated(var_data%ARR_INT)) var_sum%ARR_INT=var_data%ARR_INT+var_sum%ARR_INT
856  IF(Associated(var_data%CUB_INT)) var_sum%CUB_INT=var_data%CUB_INT+var_sum%CUB_INT
857 
858  IF(Associated(var_data%SCL_FLT)) var_sum%SCL_FLT=var_data%SCL_FLT+var_sum%SCL_FLT
859  IF(Associated(var_data%VEC_FLT)) var_sum%VEC_FLT=var_data%VEC_FLT+var_sum%VEC_FLT
860  IF(Associated(var_data%ARR_FLT)) var_sum%ARR_FLT=var_data%ARR_FLT+var_sum%ARR_FLT
861  IF(Associated(var_data%CUB_FLT)) var_sum%CUB_FLT=var_data%CUB_FLT+var_sum%CUB_FLT
862 
863  IF(Associated(var_data%SCL_DBL)) var_sum%SCL_DBL=var_data%SCL_DBL+var_sum%SCL_DBL
864  IF(Associated(var_data%VEC_DBL)) var_sum%VEC_DBL=var_data%VEC_DBL+var_sum%VEC_DBL
865  IF(Associated(var_data%ARR_DBL)) var_sum%ARR_DBL=var_data%ARR_DBL+var_sum%ARR_DBL
866  IF(Associated(var_data%CUB_DBL)) var_sum%CUB_DBL=var_data%CUB_DBL+var_sum%CUB_DBL
867 
868 
869  current_data => current_data%NEXT
870  current_sum => current_sum%NEXT
871  END DO
872 
873 
874  END SUBROUTINE add_average
875 !============================================================
876  SUBROUTINE divide_average
877  IMPLICIT NONE
878  TYPE(ncvarp),POINTER :: CURRENT
879  TYPE(ncvar),POINTER :: VAR
880  REAL(DP) :: avg_steps
881 
882  avg_steps = seconds(nc_avg%FTIME%INTERVAL)/seconds(imdti)
883 
884  current => nc_avg_sum%VARS%NEXT
885 
886  DO
887  IF(.NOT. ASSOCIATED(current)) THEN
888  EXIT ! END OF VAR LIST
889  END IF
890 
891  IF(.NOT. ASSOCIATED(current%VAR)) THEN
892  CALL fatal_error("ALLOCATE_ASSOCIATED_VARS: FOUND NULL VAR POINTER IN THE LIST")
893  END IF
894 
895  var => current%VAR
896 
897 
898  IF(Associated(var%SCL_INT)) var%SCL_INT=var%SCL_INT/avg_steps
899  IF(Associated(var%VEC_INT)) var%VEC_INT=var%VEC_INT/avg_steps
900  IF(Associated(var%ARR_INT)) var%ARR_INT=var%ARR_INT/avg_steps
901  IF(Associated(var%CUB_INT)) var%CUB_INT=var%CUB_INT/avg_steps
902 
903  IF(Associated(var%SCL_FLT)) var%SCL_FLT=var%SCL_FLT/avg_steps
904  IF(Associated(var%VEC_FLT)) var%VEC_FLT=var%VEC_FLT/avg_steps
905  IF(Associated(var%ARR_FLT)) var%ARR_FLT=var%ARR_FLT/avg_steps
906  IF(Associated(var%CUB_FLT)) var%CUB_FLT=var%CUB_FLT/avg_steps
907 
908  IF(Associated(var%SCL_DBL)) var%SCL_DBL=var%SCL_DBL/avg_steps
909  IF(Associated(var%VEC_DBL)) var%VEC_DBL=var%VEC_DBL/avg_steps
910  IF(Associated(var%ARR_DBL)) var%ARR_DBL=var%ARR_DBL/avg_steps
911  IF(Associated(var%CUB_DBL)) var%CUB_DBL=var%CUB_DBL/avg_steps
912 
913 
914  current => current%NEXT
915  END DO
916 
917  END SUBROUTINE divide_average
918 !============================================================
919  SUBROUTINE zero_average
920  IMPLICIT NONE
921  TYPE(ncvarp),POINTER :: CURRENT
922  TYPE(ncvar),POINTER :: VAR
923  REAL(DP) :: avg_steps
924 
925  avg_steps = seconds(nc_avg%FTIME%INTERVAL)/seconds(imdti)
926 
927  current => nc_avg_sum%VARS%NEXT
928 
929  DO
930  IF(.NOT. ASSOCIATED(current)) THEN
931  EXIT ! END OF VAR LIST
932  END IF
933 
934  IF(.NOT. ASSOCIATED(current%VAR)) THEN
935  CALL fatal_error("ALLOCATE_ASSOCIATED_VARS: FOUND NULL VAR POINTER IN THE LIST")
936  END IF
937 
938  var => current%VAR
939 
940 
941  IF(Associated(var%SCL_INT)) var%SCL_INT=0
942  IF(Associated(var%VEC_INT)) var%VEC_INT=0
943  IF(Associated(var%ARR_INT)) var%ARR_INT=0
944  IF(Associated(var%CUB_INT)) var%CUB_INT=0
945 
946  IF(Associated(var%SCL_FLT)) var%SCL_FLT=0.0_spa
947  IF(Associated(var%VEC_FLT)) var%VEC_FLT=0.0_spa
948  IF(Associated(var%ARR_FLT)) var%ARR_FLT=0.0_spa
949  IF(Associated(var%CUB_FLT)) var%CUB_FLT=0.0_spa
950 
951  IF(Associated(var%SCL_DBL)) var%SCL_DBL=0.0_dp
952  IF(Associated(var%VEC_DBL)) var%VEC_DBL=0.0_dp
953  IF(Associated(var%ARR_DBL)) var%ARR_DBL=0.0_dp
954  IF(Associated(var%CUB_DBL)) var%CUB_DBL=0.0_dp
955 
956 
957  current => current%NEXT
958  END DO
959 
960  END SUBROUTINE zero_average
961 !=============================================================
962  SUBROUTINE setup_rstfile
963  IMPLICIT NONE
964 
965  TYPE(grid), SAVE :: MYGRID
966  TYPE(ncfile), POINTER ::NC_RST2
967 
968  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START SETUP_RSTFILE"
969 
970  IF(dbg_set(dbg_log)) THEN
971 
972  write(ipt,*)"!--------------------------------------------------"
973  write(ipt,*)"! SETTING UP RESTART FILE OUTPUT..."
974  END IF
975 
976  CALL set_fvcom_grid(mygrid)
977 
978  CALL define_dimensions(mygrid)
979 
980  nc_rst2 => grid_file_object(mygrid)
981  nc_rst => add(nc_rst,nc_rst2)
982 !!$ NC_RST => ADD(NC_RST,GRID_FILE_OBJECT(MYGRID) )
983 
984  nc_rst2 => time_file_object()
985  nc_rst => add(nc_rst,nc_rst2)
986 !!$ NC_RST => ADD(NC_RST,TIME_FILE_OBJECT() )
987 
988  nc_rst2 => zeta_file_object()
989  nc_rst => add(nc_rst,nc_rst2)
990 !!$ NC_RST => ADD(NC_RST,ZETA_FILE_OBJECT() )
991 
992  nc_rst2 => file_date_object()
993  nc_rst => add(nc_rst,nc_rst2)
994 !!$ NC_RST => ADD(NC_RST,FILE_DATE_OBJECT() )
995 
996  nc_rst2 => velocity_file_object()
997  nc_rst => add(nc_rst,nc_rst2)
998 !!$ NC_RST => ADD(NC_RST,VELOCITY_FILE_OBJECT() )
999 
1000  nc_rst2 => average_vel_file_object()
1001  nc_rst => add(nc_rst,nc_rst2)
1002 !!$ NC_RST => ADD(NC_RST,AVERAGE_VEL_FILE_OBJECT() )
1003 
1004  nc_rst2 => vertical_vel_file_object()
1005  nc_rst => add(nc_rst,nc_rst2)
1006 !!$ NC_RST => ADD(NC_RST,VERTICAL_VEL_FILE_OBJECT() )
1007 
1008  nc_rst2 => turbulence_file_object()
1009  nc_rst => add(nc_rst,nc_rst2)
1010 !!$ NC_RST => ADD(NC_RST,TURBULENCE_FILE_OBJECT() )
1011 
1012  nc_rst2 => salt_temp_file_object()
1013  nc_rst => add(nc_rst,nc_rst2)
1014 !!$ NC_RST => ADD(NC_RST,SALT_TEMP_FILE_OBJECT() )
1015 
1016  nc_rst2 => restart_extras_file_object()
1017  nc_rst => add(nc_rst,nc_rst2)
1018 !!$ NC_RST => ADD(NC_RST,RESTART_EXTRAS_FILE_OBJECT() )
1019 
1020  nc_rst2 => density_file_object()
1021  nc_rst => add(nc_rst,nc_rst2)
1022 !!$ NC_RST => ADD(NC_RST,DENSITY_FILE_OBJECT() )
1023 
1024  IF(wetting_drying_on) THEN
1025  nc_rst2 => wet_dry_file_object()
1026  nc_rst => add(nc_rst, nc_rst2)
1027 !!$ NC_RST => ADD(NC_RST, WET_DRY_FILE_OBJECT() )
1028  END IF
1029 
1030 
1031 
1032 
1033 
1034 
1035 
1036 
1037  IF (startup_type /= "crashrestart") THEN
1038  CALL nc_write_file(nc_rst)
1039  nc_rst%FTIME%NEXT_STKCNT = 1
1040  ELSE
1041  nc_rst%CONNECTED = .true.
1042  END IF
1043 
1044  CALL kill_dimensions
1045 
1046  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END SETUP_RSTFILE"
1047  END SUBROUTINE setup_rstfile
1048 !=============================================================
1049  SUBROUTINE dump_data(NCF)
1050  IMPLICIT NONE
1051  TYPE(ncfile), POINTER ::NCF
1052  TYPE(ncftime), POINTER :: FTM
1053 
1054  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START DUMP_DATA"
1055 
1056  IF(dbg_set(dbg_io)) CALL print_file(ncf)
1057  IF(dbg_set(dbg_sbrio)) CALL print_var_list(ncf)
1058 
1059  ftm => ncf%FTIME
1060 
1061 
1062  IF (ftm%MAX_STKCNT .NE. 0 .AND. &
1063  & ftm%NEXT_STKCNT > ftm%MAX_STKCNT) THEN
1064 
1065  ftm%NEXT_STKCNT=0
1066  CALL incriment_fname(ncf%FNAME)
1067  ncf%CONNECTED=.false.
1068 
1069 
1070  ! WRITE NEW FILE'S CONSTANT DATA (GRID ETC)
1071  CALL nc_write_file(ncf)
1072 
1073  ! INCRIMENT THE STACK COUNT
1074  ftm%NEXT_STKCNT = 1
1075 
1076  END IF
1077 
1078 
1079  ! IF UPDATE IODATA BECOMES SPECIFIC TO DIFFERENT DATA SETS IT
1080  ! WILL HAVE TO BE MOVED INSIDE OF THE PARTICULAR OUTPUT STATEMENTS
1081  CALL update_iodata(ncf,inttime)
1082 
1083  CALL nc_write_file(ncf)
1084 
1085  ! ONCE THE FILE IS WRITEN INCRIMENT THE FILE OBJECT TIME
1086  ftm%PREV_IO = inttime
1087  ftm%NEXT_IO = ftm%NEXT_IO + ftm%INTERVAL
1088 
1089  ! INCRIMENT THE STACK COUNT
1090  ftm%PREV_STKCNT = ftm%NEXT_STKCNT
1091  ftm%NEXT_STKCNT = ftm%NEXT_STKCNT + 1
1092 
1093  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END DUMP_DATA"
1094 
1095  END SUBROUTINE dump_data
1096 !=============================================================
1097  SUBROUTINE define_dimensions(G)
1099 
1100 !# if defined (WAVE_CURRENT_INTERACTION)
1101 ! USE SWCOMM3
1102 ! USE VARS_WAVE
1103 ! USE MOD_WAVE_CURRENT_INTERACTION
1104 !# endif
1105  USE bcs
1106  IMPLICIT NONE
1107  TYPE(grid) :: G
1108  INTEGER :: SBUF, SOURCE
1109  INTEGER :: RBUF, DEST
1110 
1111 
1112  dim_nele => nc_make_dim(name='nele',len=g%ngl)
1113  dim_node => nc_make_dim(name='node',len=g%mgl)
1114 
1115  dim_three => nc_make_dim(name='three',len=3)
1116  dim_four => nc_make_dim(name='four',len=4)
1117 
1118  dim_siglev => nc_make_dim(name='siglev',len=g%kb)
1119  dim_siglay => nc_make_dim(name='siglay',len=g%kbm1)
1120 
1121 
1122  dim_datestrlen => nc_make_dim(name='DateStrLen',len=datestrlen)
1123  dim_time => nc_make_dim(name='time',len=nf90_unlimited)
1124 
1125  NULLIFY(dim_grid,dim_ncat,dim_ntilay)
1126 
1127  ! ONLY USED IF OBC IS ON
1128  IF(obc_on) THEN
1129  dim_nobc => nc_make_dim(name='nobc',len=iobcn_gl)
1130  ELSE
1131  nullify(dim_nobc)
1132  END IF
1133  ! ONLY USED IF LOND SHORE FLOW BOUNDARY IS ON
1134  IF(obc_longshore_flow_on) THEN
1135  dim_nlsf => nc_make_dim(name='nlsf',len=nobclsf_gl)
1136  ELSE
1137  nullify(dim_nlsf)
1138  END IF
1139 
1140  dim_maxnode => nc_make_runtime_dim(name='maxnode',len=mx_nbr_elem+3)
1141 
1142  dim_maxelem => nc_make_runtime_dim(name='maxelem',len=mx_nbr_elem+1)
1143 
1144 
1145  END SUBROUTINE define_dimensions
1146 
1147  SUBROUTINE kill_dimensions
1148  IMPLICIT NONE
1149 
1150  IF (ASSOCIATED(dim_nele)) CALL kill_dim(dim_nele)
1151  IF (ASSOCIATED(dim_node)) CALL kill_dim(dim_node)
1152 
1153  IF (ASSOCIATED(dim_three)) CALL kill_dim(dim_three)
1154  IF (ASSOCIATED(dim_four)) CALL kill_dim(dim_four)
1155 
1156  IF (ASSOCIATED(dim_siglay)) CALL kill_dim(dim_siglay)
1157  IF (ASSOCIATED(dim_siglev)) CALL kill_dim(dim_siglev)
1158 
1159  IF (ASSOCIATED(dim_datestrlen)) CALL kill_dim(dim_datestrlen)
1160  IF (ASSOCIATED(dim_time)) CALL kill_dim(dim_time)
1161 
1162  IF (ASSOCIATED(dim_grid)) CALL kill_dim(dim_grid)
1163  IF (ASSOCIATED(dim_ncat)) CALL kill_dim(dim_ncat)
1164  IF (ASSOCIATED(dim_ntilay)) CALL kill_dim(dim_ntilay)
1165 
1166  IF (ASSOCIATED(dim_nobc)) CALL kill_dim(dim_nobc)
1167  IF (ASSOCIATED(dim_nlsf)) CALL kill_dim(dim_nlsf)
1168 
1169  IF (ASSOCIATED(dim_maxnode)) CALL kill_dim(dim_maxnode)
1170  IF (ASSOCIATED(dim_maxelem)) CALL kill_dim(dim_maxelem)
1171 
1172  END SUBROUTINE kill_dimensions
1173 !=============================================================
1174  FUNCTION grid_file_object(G) RESULT(NCF)
1176  USE mod_force
1177  IMPLICIT NONE
1178 
1179  TYPE(grid) :: g
1180  INTEGER, POINTER :: partition(:)
1181  INTEGER :: status, i
1182  LOGICAL, SAVE :: ioproc_allocated = .false.
1183  TYPE(ncfile), POINTER :: ncf
1184  TYPE(ncvar), POINTER :: var
1185  TYPE(ncatt), POINTER :: att
1186 
1187  character(len=100) :: timestamp, temp, netcdf_convention
1188 
1189  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START GRID_FILE_OBJECT"
1190 
1191  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
1192  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
1193  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
1194  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
1195 
1196 
1197  ! MGL AND NGL ARE THE BIGEST THING GOING - USE THEM TO MAKE
1198  ! SURE WE DON'T GET A SIG SEV - MULTIPLE FILE GRIDS MAY USE
1199  ! THESE POINTERS!
1200  ioproc_allocated = .true.
1201 
1202  allocate(partition(ngl),stat=status)
1203  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:partition")
1204  partition = 0
1205 
1206  allocate(xm(mgl),stat=status)
1207  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:XM")
1208  xm = 0.0_sp
1209 
1210  allocate(ym(mgl),stat=status)
1211  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:YM")
1212  ym = 0.0_sp
1213 
1214  allocate(lon(mgl),stat=status)
1215  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:LON")
1216  lon = 0.0_sp
1217 
1218  allocate(lat(mgl),stat=status)
1219  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:LAT")
1220  lat = 0.0_sp
1221 
1222  allocate(xmc(ngl),stat=status)
1223  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:XMC")
1224  xmc = 0.0_sp
1225 
1226  allocate(ymc(ngl),stat=status)
1227  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:YMC")
1228  ymc = 0.0_sp
1229 
1230  allocate(lonc(ngl),stat=status)
1231  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:LONC")
1232  lonc = 0.0_sp
1233 
1234  allocate(latc(ngl),stat=status)
1235  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:LATC")
1236  latc = 0.0_sp
1237 
1238  allocate(zz(mgl,kb),stat=status)
1239  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ZZ")
1240  zz = 0.0_sp
1241 
1242  allocate(z(mgl,kb),stat=status)
1243  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:Z")
1244  z = 0.0_sp
1245 
1246  allocate(h(mgl),stat=status)
1247  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:H")
1248  h = 0.0_sp
1249 
1250 !# if defined(UCF)
1251  allocate(zz1(ngl,kb),stat=status)
1252  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ZZ1")
1253  zz1 = 0.0_sp
1254 
1255  allocate(z1(ngl,kb),stat=status)
1256  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:Z1")
1257  z1 = 0.0_sp
1258 
1259  allocate(h1(ngl),stat=status)
1260  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORcY ON IO PROC FOR OUTPUT DATA:H1")
1261  h1 = 0.0_sp
1262 !# endif
1263 
1264 
1265  END IF
1266 
1267  IF(ioproc) THEN
1268 
1269  ! ALLOCATE NV BASED ON THE GRID DIMENSION
1270  IF(ASSOCIATED(g%NV)) THEN
1271 
1272  IF(ubound(g%nv,1)/=dim_nele%DIM) THEN
1273  CALL fatal_error &
1274  &("GRID DATA NV HAS ALREADY BEEN ASSOICATED ON THE IOPROC",&
1275  & "AND THE DIMENSION DOES NOT MATCH THE CURRENT FILE!",&
1276  &"GRID NAME:"//trim(g%NAME))
1277  END IF
1278 
1279  ELSE
1280  allocate(g%nv(g%NGL,3),stat=status)
1281  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:G%NV")
1282  g%nv = 0
1283  END IF
1284  END IF
1285 
1286 
1287 
1288  ! ALLOCATE THE NEW FILE OBJECT
1289  ncf => new_file()
1290 
1291 
1292  ! ADD THE FILE ATTRIBUTES
1293  att => nc_make_att(name='title',values=trim(case_title))
1294  ncf => add(ncf,att)
1295 
1296 
1297  att => nc_make_att(name='institution',values=trim(institution))
1298  ncf => add(ncf,att)
1299 
1300  att => nc_make_att(name='source',values=trim(fvcom_version))
1301  ncf => add(ncf,att)
1302 
1303  call get_timestamp(temp)
1304  timestamp = 'model started at: '//trim(temp)
1305 
1306  att => nc_make_att(name='history',values=trim(timestamp))
1307  ncf => add(ncf,att)
1308 
1309  att => nc_make_att(name='references',values=trim(fvcom_website))
1310  ncf => add(ncf,att)
1311 
1312  netcdf_convention = 'CF-1.0'
1313  att => nc_make_att(name='Conventions',values=trim(netcdf_convention))
1314  ncf => add(ncf,att)
1315 
1316  att => nc_make_att(name='CoordinateSystem',values="Cartesian" )
1317  ncf => add(ncf,att)
1318 
1319  att => nc_make_att(name='CoordinateProjection',values=projection_reference )
1320  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1321 
1322  IF(trim(prg_name) == "FVCOM") THEN
1323 
1324  att=> nc_make_runtime_att_chr(name='Tidal_Forcing',values=tide_forcing_comments)
1325  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1326 
1327  att=> nc_make_runtime_att_chr(name='River_Forcing',values=river_forcing_comments)
1328  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1329 
1330  att=> nc_make_runtime_att_chr(name='GroundWater_Forcing',values=gwater_forcing_comments)
1331  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1332 
1333  att=> nc_make_runtime_att_chr(name='Surface_Heat_Forcing',values=heat_forcing_comments)
1334  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1335 
1336  att=> nc_make_runtime_att_chr(name='Surface_Wind_Forcing',values=winds_forcing_comments)
1337  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1338 
1339 !------Jadon for offline wave forcing
1340 
1341  att=> nc_make_runtime_att_chr(name='Surface_PrecipEvap_Forcing',values=precip_forcing_comments)
1342  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1343 
1344  IF (icing_model) THEN
1345  att=> nc_make_runtime_att_chr(name='Icing_Model_Forcing',values=icing_forcing_comments)
1346  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1347  END IF
1348 
1349  IF (ice_model) THEN
1350  att=> nc_make_runtime_att_chr(name='Ice_Model_Forcing',values=ice_forcing_comments)
1351  IF(ASSOCIATED(att)) ncf => add(ncf,att)
1352  END IF
1353 
1354 
1355  IF(obc_longshore_flow_on) THEN
1356  att=> nc_make_att(name='Special_Physical_processes',&
1357  & values='long shore flow adjustment for thermal wind and win&
1358  &d driven setup')
1359  ncf => add(ncf,att)
1360  END IF
1361 
1362  END IF
1363 
1364  ! ADD THE VARIABLES
1365 
1366  ! NPROCS
1367  var => nc_make_avar(name='nprocs',values=nprocs)
1368 
1369  att => nc_make_att(name='long_name',values='number of processors')
1370  var => add(var,att)
1371  ncf => add(ncf,var)
1372 
1373 
1374 
1375 
1376  ! X
1377  var => nc_make_avar(name='x',values=xm,dim1=dim_node)
1378 
1379  att => nc_make_att(name='long_name',values='nodal x-coordinate')
1380  var => add(var,att)
1381 
1382  att => nc_make_att(name='units',values='meters')
1383  var => add(var,att)
1384  ncf => add(ncf,var)
1385 
1386  ! Y
1387  var => nc_make_avar(name='y',values=ym,dim1=dim_node)
1388 
1389  att => nc_make_att(name='long_name',values='nodal y-coordinate')
1390  var => add(var,att)
1391 
1392  att => nc_make_att(name='units',values='meters')
1393  var => add(var,att)
1394 
1395  ncf => add(ncf,var)
1396 
1397 
1398  ! LON
1399  var => nc_make_avar(name='lon',values=lon,dim1=dim_node)
1400 
1401  att => nc_make_att(name='long_name',values='nodal longitude')
1402  var => add(var,att)
1403 
1404  att => nc_make_att(name='standard_name',values='longitude')
1405  var => add(var,att)
1406 
1407  att => nc_make_att(name='units',values='degrees_east')
1408  var => add(var,att)
1409  ncf => add(ncf,var)
1410 
1411  ! LAT
1412  var => nc_make_avar(name='lat',values=lat,dim1=dim_node)
1413 
1414  att => nc_make_att(name='long_name',values='nodal latitude')
1415  var => add(var,att)
1416 
1417  att => nc_make_att(name='standard_name',values='latitude')
1418  var => add(var,att)
1419 
1420  att => nc_make_att(name='units',values='degrees_north')
1421  var => add(var,att)
1422 
1423  ncf => add(ncf,var)
1424 
1425  IF (ALLOCATED(xmc)) THEN
1426  ! XMC
1427  var => nc_make_avar(name='xc',values=xmc,dim1=dim_nele)
1428 
1429  att => nc_make_att(name='long_name',values='zonal x-coordinate')
1430  var => add(var,att)
1431 
1432  att => nc_make_att(name='units',values='meters')
1433  var => add(var,att)
1434  ncf => add(ncf,var)
1435  END IF
1436 
1437  IF (ALLOCATED(ymc)) THEN
1438  ! YMC
1439  var => nc_make_avar(name='yc',values=ymc,dim1=dim_nele)
1440 
1441  att => nc_make_att(name='long_name',values='zonal y-coordinate')
1442  var => add(var,att)
1443 
1444  att => nc_make_att(name='units',values='meters')
1445  var => add(var,att)
1446 
1447  ncf => add(ncf,var)
1448  END IF
1449 
1450  IF (ALLOCATED(lonc)) THEN
1451  ! LONC
1452  var => nc_make_avar(name='lonc',values=lonc,dim1=dim_nele)
1453 
1454  att => nc_make_att(name='long_name',values='zonal longitude')
1455  var => add(var,att)
1456 
1457  att => nc_make_att(name='standard_name',values='longitude')
1458  var => add(var,att)
1459 
1460  att => nc_make_att(name='units',values='degrees_east')
1461  var => add(var,att)
1462  ncf => add(ncf,var)
1463  END IF
1464 
1465  IF (ALLOCATED(latc)) THEN
1466  ! LATC
1467  var => nc_make_avar(name='latc',values=latc,dim1=dim_nele)
1468 
1469  att => nc_make_att(name='long_name',values='zonal latitude')
1470  var => add(var,att)
1471 
1472  att => nc_make_att(name='standard_name',values='latitude')
1473  var => add(var,att)
1474 
1475  att => nc_make_att(name='units',values='degrees_north')
1476  var => add(var,att)
1477 
1478  ncf => add(ncf,var)
1479  END IF
1480 
1481  IF (ALLOCATED(zz)) THEN
1482  ! siglay
1483  var => nc_make_avar(name='siglay',&
1484  & values=zz,&
1485  & dim1= dim_node,&
1486  & dim2= dim_siglay )
1487 
1488  att => nc_make_att(name='long_name',values='Sigma Layers')
1489  var => add(var,att)
1490 
1491  att => nc_make_att(name='standard_name',values='ocean_sigma/general_coordinate')
1492  var => add(var,att)
1493 
1494  att => nc_make_att(name='positive',values='up')
1495  var => add(var,att)
1496 
1497  att => nc_make_att(name='valid_min',values=-1.0_spa)
1498  var => add(var,att)
1499 
1500  att => nc_make_att(name='valid_max',values=0.0_spa)
1501  var => add(var,att)
1502 
1503  att => nc_make_att(name='formula_terms',values='sigma: siglay eta: zeta depth: h')
1504  var => add(var,att)
1505 
1506  ncf => add(ncf,var)
1507  END IF
1508 
1509  IF (ALLOCATED(z)) THEN
1510  ! siglev
1511  var => nc_make_avar(name='siglev',&
1512  & values=z, dim1= dim_node, dim2= dim_siglev )
1513 
1514  att => nc_make_att(name='long_name',values='Sigma Levels')
1515  var => add(var,att)
1516 
1517  att => nc_make_att(name='standard_name',values='ocean_sigma/general_coordinate')
1518  var => add(var,att)
1519 
1520  att => nc_make_att(name='positive',values='up')
1521  var => add(var,att)
1522 
1523  att => nc_make_att(name='valid_min',values=-1.0_spa)
1524  var => add(var,att)
1525 
1526  att => nc_make_att(name='valid_max',values=0.0_spa)
1527  var => add(var,att)
1528 
1529  att => nc_make_att(name='formula_terms',values='sigma:siglay eta: zeta depth: h')
1530  var => add(var,att)
1531 
1532  ncf => add(ncf,var)
1533  END IF
1534 
1535 !# if defined(UCF)
1536  ! ADD SIGMA VALUE AT CELL CENTERS!
1537  IF (ALLOCATED(zz1)) THEN
1538  ! siglay
1539  var => nc_make_avar(name='siglay_center',&
1540  & values=zz1,&
1541  & dim1= dim_nele,&
1542  & dim2= dim_siglay )
1543 
1544  att => nc_make_att(name='long_name',values='Sigma Layers')
1545  var => add(var,att)
1546 
1547  att => nc_make_att(name='standard_name',values='ocean_sigma/general_coordinate')
1548  var => add(var,att)
1549 
1550  att => nc_make_att(name='positive',values='up')
1551  var => add(var,att)
1552 
1553  att => nc_make_att(name='valid_min',values=-1.0_spa)
1554  var => add(var,att)
1555 
1556  att => nc_make_att(name='valid_max',values=0.0_spa)
1557  var => add(var,att)
1558 
1559  att => nc_make_att(name='formula_terms',values='sigma: siglay_center eta: zeta_center depth: h_center')
1560  var => add(var,att)
1561 
1562  ncf => add(ncf,var)
1563  END IF
1564 
1565  IF (ALLOCATED(z1)) THEN
1566  ! siglev
1567  var => nc_make_avar(name='siglev_center',&
1568  & values=z1, dim1= dim_nele, dim2= dim_siglev )
1569 
1570  att => nc_make_att(name='long_name',values='Sigma Levels')
1571  var => add(var,att)
1572 
1573  att => nc_make_att(name='standard_name',values='ocean_sigma/general_coordinate')
1574  var => add(var,att)
1575 
1576  att => nc_make_att(name='positive',values='up')
1577  var => add(var,att)
1578 
1579  att => nc_make_att(name='valid_min',values=-1.0_spa)
1580  var => add(var,att)
1581 
1582  att => nc_make_att(name='valid_max',values=0.0_spa)
1583  var => add(var,att)
1584 
1585  att => nc_make_att(name='formula_terms',values='sigma:siglay_center eta: zeta_center depth: h_center')
1586  var => add(var,att)
1587 
1588  ncf => add(ncf,var)
1589  END IF
1590 
1591  IF (ALLOCATED(h1)) THEN
1592  ! h1 (if morphodynamics is on, dump time-dependent bathymetry)
1593  var => nc_make_avar(name='h_center',values=h1, dim1= dim_nele)
1594 
1595  att => nc_make_att(name='long_name',values='Bathymetry')
1596  var => add(var,att)
1597 
1598  att => nc_make_att(name='standard_name',values='sea_floor_depth_below_geoid')
1599  var => add(var,att)
1600 
1601  att => nc_make_att(name='units',values='m')
1602  var => add(var,att)
1603 
1604  att => nc_make_att(name='positive',values='down')
1605  var => add(var,att)
1606 
1607  att => nc_make_att(name='grid',values='grid1 grid3')
1608  var => add(var,att)
1609 
1610  att => nc_make_att(name='coordinates',values='latc lonc')
1611  var => add(var,att)
1612 
1613  att => nc_make_att(name='grid_location',values='center')
1614  var => add(var,att)
1615 
1616  ncf => add(ncf,var)
1617  END IF
1618 
1619 
1620 !# endif
1621 
1622  IF (ALLOCATED(h)) THEN
1623  ! h (if morphodynamics is on, dump time-dependent bathymetry)
1624  var => nc_make_avar(name='h',values=h, dim1= dim_node)
1625 
1626  att => nc_make_att(name='long_name',values='Bathymetry')
1627  var => add(var,att)
1628 
1629  att => nc_make_att(name='standard_name',values='sea_floor_depth_below_geoid')
1630  var => add(var,att)
1631 
1632  att => nc_make_att(name='units',values='m')
1633  var => add(var,att)
1634 
1635  att => nc_make_att(name='positive',values='down')
1636  var => add(var,att)
1637 
1638  att => nc_make_att(name='grid',values='Bathymetry_Mesh')
1639  var => add(var,att)
1640 
1641  att => nc_make_att(name='coordinates',values=coordvar)
1642  var => add(var,att)
1643 
1644  att => nc_make_att(name='type',values='data')
1645  var => add(var,att)
1646 
1647  ncf => add(ncf,var)
1648  END IF
1649 
1650  ! nv
1651  var => nc_make_pvar(name='nv',&
1652  & values=g%nv, dim1= dim_nele, dim2= dim_three)
1653 
1654  att => nc_make_att(name='long_name',values='nodes surrounding element')
1655  var => add(var,att)
1656 
1657  ncf => add(ncf,var)
1658 
1659  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END GRID_FILE_OBJECT"
1660 
1661 
1662  END FUNCTION grid_file_object
1663 
1664 !=============================================================
1665  FUNCTION zeta_file_object() RESULT(NCF)
1666  IMPLICIT NONE
1667 
1668  INTEGER :: status, i
1669  LOGICAL, SAVE :: ioproc_allocated = .false.
1670  TYPE(ncfile), POINTER :: ncf
1671  TYPE(ncvar), POINTER :: var
1672  TYPE(ncatt), POINTER :: att
1673 
1674 
1675  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START ZETA_FILE_OBJECT"
1676 
1677  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
1678  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
1679  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
1680  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
1681 
1682  ioproc_allocated = .true.
1683 
1684  allocate(el(mgl),stat=status)
1685  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:EL")
1686  el = 0.0_sp
1687 
1688 
1689  END IF
1690 
1691  ! ALLOCATE THE NEW FILE OBJECT
1692  ncf => new_file()
1693 
1694 
1695  IF (ALLOCATED(el)) THEN
1696  ! zeta
1697  var => nc_make_avar(name='zeta',&
1698  & values=el, dim1= dim_node, dim2= dim_time)
1699 
1700  att => nc_make_att(name='long_name',values='Water Surface Elevation')
1701  var => add(var,att)
1702 
1703  att => nc_make_att(name='units',values='meters')
1704  var => add(var,att)
1705 
1706  att => nc_make_att(name='positive',values='up')
1707  var => add(var,att)
1708 
1709  att => nc_make_att(name='standard_name',values='sea_surface_height_above_geoid')
1710  var => add(var,att)
1711 
1712  att => nc_make_att(name='grid',values='Bathymetry_Mesh')
1713  var => add(var,att)
1714 
1715 !!$ ATT => NC_MAKE_ATT(name='coordinates',values=CoordVar)
1716  att => nc_make_att(name='coordinates',values="time lat lon")
1717  var => add(var,att)
1718 
1719  att => nc_make_att(name='type',values='data')
1720  var => add(var,att)
1721 
1722  att => nc_make_att(name='location',values='node')
1723  var => add(var,att)
1724 
1725  ncf => add(ncf,var)
1726  END IF
1727 
1728 
1729  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END ZETA_FILE_OBJECT"
1730 
1731  END FUNCTION zeta_file_object
1732 !=============================================================
1733  FUNCTION grid_metrics_file_object(G) RESULT(NCF)
1734  IMPLICIT NONE
1735 
1736  TYPE(grid) :: g
1737 
1738  INTEGER :: status
1739  LOGICAL, SAVE :: ioproc_allocated = .false.
1740  TYPE(ncfile), POINTER :: ncf
1741  TYPE(ncvar), POINTER :: var
1742  TYPE(ncatt), POINTER :: att
1743 
1744  REAL(sp), POINTER :: vec_flt(:),arr_flt(:)
1745  INTEGER, POINTER :: vec_int(:),arr_int(:)
1746 
1747  character(len=100) :: timestamp, temp, netcdf_convention
1748 
1749  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START GRID_METRICS_FILE_OBJECT"
1750 
1751  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
1752  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
1753  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
1754 
1755  IF(ioproc) THEN
1756  ! ALWAYS ALLOCATE SPECIAL SPACE IN THE GRID TYPE FOR INDEX ARRAYS!
1757 
1758  IF(.NOT. ASSOCIATED(g%NBE)) THEN
1759  allocate(g%NBE(g%NGL,3),stat=status)
1760  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:G%NBE")
1761  g%NBE = 0
1762  ELSE
1763  IF(ubound(g%NBE,1)/=dim_nele%DIM) CALL fatal_error &
1764  &("GRID DATA NBE HAS ALREADY BEEN ASSOICATED ON THE IOPROC",&
1765  & "AND THE DIMENSION DOES NOT MATCH THE CURRENT FILE!",&
1766  &"GRID NAME:"//trim(g%NAME))
1767  END IF
1768 
1769  IF(.NOT. ASSOCIATED(g%NBSN)) THEN
1770  allocate(g%NBSN(g%MGL,dim_maxnode%DIM),stat=status)
1771  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:G%NBSN")
1772  g%NBSN = 0
1773  ELSE
1774  IF(ubound(g%NBSN,1)/=dim_node%DIM) CALL fatal_error &
1775  &("GRID DATA NBSN HAS ALREADY BEEN ASSOICATED ON THE IOPROC",&
1776  & "AND THE DIMENSION DOES NOT MATCH THE CURRENT FILE!",&
1777  &"GRID NAME:"//trim(g%NAME))
1778  END IF
1779 
1780  IF(.NOT. ASSOCIATED(g%NBVE)) THEN
1781  allocate(g%NBVE(g%MGL,dim_maxelem%DIM),stat=status)
1782  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:G%NBVE")
1783  g%NBVE = 0
1784  ELSE
1785  IF(ubound(g%NBVE,1)/=dim_node%DIM) CALL fatal_error &
1786  &("GRID DATA NBVE HAS ALREADY BEEN ASSOICATED ON THE IOPROC",&
1787  & "AND THE DIMENSION DOES NOT MATCH THE CURRENT FILE!",&
1788  &"GRID NAME:"//trim(g%NAME))
1789  END IF
1790 
1791 
1792  END IF
1793 
1794 
1795  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
1796 
1797  ! ONLY ALLOCATE THIS SPACE ONCE - IT IS SHARED NO MATTER WHAT
1798  ! DOMAIN IS BEING SAVED!
1799  ioproc_allocated = .true.
1800 
1801  allocate(ntsn(mgl),stat=status)
1802  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:NTSN")
1803  ntsn = 0
1804 
1805  allocate(ntve(mgl),stat=status)
1806  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:NTVE")
1807  ntve = 0
1808 
1809  allocate(a1u(ngl,4),stat=status)
1810  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:A1U")
1811  a1u = 0.0_sp
1812 
1813  allocate(a2u(ngl,4),stat=status)
1814  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:A2U")
1815  a2u = 0.0_sp
1816 
1817  allocate(awx(ngl,3),stat=status)
1818  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:AWX")
1819  awx = 0.0_sp
1820 
1821  allocate(awy(ngl,3),stat=status)
1822  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:AWY")
1823  awy = 0.0_sp
1824 
1825  allocate(aw0(ngl,3),stat=status)
1826  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:AW0")
1827  aw0 = 0.0_sp
1828 
1829  allocate(art2(mgl),stat=status)
1830  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ART2")
1831  art2 = 0.0_sp
1832 
1833  allocate(art1(mgl),stat=status)
1834  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ART1")
1835  art1 = 0.0_sp
1836 
1837 
1838  END IF
1839 
1840 
1841  ! ALLOCATE THE NEW FILE OBJECT
1842  ncf => new_file()
1843 
1844 
1845  ! NBE
1846  var => nc_make_pvar(name='nbe',&
1847  & values=g%NBE, dim1= dim_nele, dim2= dim_three)
1848 
1849  att => nc_make_att(name='long_name',values='elements surrounding each element')
1850  var => add(var,att)
1851 
1852  ncf => add(ncf,var)
1853 
1854  ! NTSN
1855  var => nc_make_avar(name='ntsn',&
1856  & values=ntsn, dim1= dim_node)
1857 
1858  att => nc_make_att(name='long_name',values='#nodes surrounding each node')
1859  var => add(var,att)
1860 
1861  ncf => add(ncf,var)
1862 
1863  ! NBSN
1864  var => nc_make_pvar(name='nbsn',&
1865  & values=g%NBSN, dim1= dim_node, dim2= dim_maxnode)
1866 
1867  att => nc_make_att(name='long_name',values='nodes surrounding each node')
1868  var => add(var,att)
1869 
1870  ncf => add(ncf,var)
1871 
1872  ! NTVE
1873  var => nc_make_avar(name='ntve',&
1874  & values=ntve, dim1= dim_node)
1875 
1876  att => nc_make_att(name='long_name',values='#elems surrounding each node')
1877  var => add(var,att)
1878 
1879  ncf => add(ncf,var)
1880 
1881  ! NBVE
1882  var => nc_make_pvar(name='nbve',&
1883  & values=g%NBVE, dim1= dim_node, dim2= dim_maxelem)
1884 
1885  att => nc_make_att(name='long_name',values='elems surrounding each node')
1886  var => add(var,att)
1887 
1888  ncf => add(ncf,var)
1889 
1890  ! A1U
1891  var => nc_make_avar(name='a1u',&
1892  & values=a1u, dim1= dim_nele, dim2= dim_four)
1893 
1894  att => nc_make_att(name='long_name',values='a1u')
1895  var => add(var,att)
1896 
1897  ncf => add(ncf,var)
1898 
1899  ! A2U
1900  var => nc_make_avar(name='a2u',&
1901  & values=a2u, dim1= dim_nele, dim2= dim_four)
1902 
1903  att => nc_make_att(name='long_name',values='a2u')
1904  var => add(var,att)
1905 
1906  ncf => add(ncf,var)
1907 
1908  ! AW0
1909  var => nc_make_avar(name='aw0',&
1910  & values=aw0, dim1= dim_nele, dim2= dim_three)
1911 
1912  att => nc_make_att(name='long_name',values='aw0')
1913  var => add(var,att)
1914 
1915  ncf => add(ncf,var)
1916 
1917  ! AWX
1918  var => nc_make_avar(name='awx',&
1919  & values=awx, dim1= dim_nele, dim2= dim_three)
1920 
1921  att => nc_make_att(name='long_name',values='awx')
1922  var => add(var,att)
1923 
1924  ncf => add(ncf,var)
1925 
1926  ! AWY
1927  var => nc_make_avar(name='awy',&
1928  & values=awy, dim1= dim_nele, dim2= dim_three)
1929 
1930  att => nc_make_att(name='long_name',values='awy')
1931  var => add(var,att)
1932 
1933  ncf => add(ncf,var)
1934 
1935  ! ART2
1936  var => nc_make_avar(name='art2',&
1937  & values=art2, dim1= dim_node)
1938 
1939  att => nc_make_att(name='long_name',values='Area of elements around a node')
1940  var => add(var,att)
1941 
1942  ncf => add(ncf,var)
1943 
1944  ! ART1
1945  var => nc_make_avar(name='art1',&
1946  & values=art1, dim1= dim_node)
1947 
1948  att => nc_make_att(name='long_name',values='Area of Node-Base Con&
1949  &trol volume')
1950  var => add(var,att)
1951 
1952  ncf => add(ncf,var)
1953 
1954 
1955  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END GRID_METRICS_FILE_OBJECT"
1956 
1957  END FUNCTION grid_metrics_file_object
1958 
1959 !=============================================================
1960  FUNCTION file_date_object(SIZE) RESULT(NCF)
1962  IMPLICIT NONE
1963 
1964  INTEGER :: status
1965  TYPE(ncfile), POINTER :: ncf
1966  TYPE(ncvar), POINTER :: var
1967  TYPE(ncatt), POINTER :: att
1968  INTEGER, OPTIONAL :: size
1969  CHARACTER(LEN=80),pointer :: data_vec(:)
1970 
1971 
1972  IF(PRESENT(size)) THEN
1973  ALLOCATE(data_vec(size))
1974  ELSE
1975  ALLOCATE(data_vec(1))
1976  END IF
1977 
1978 
1979  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START FILE_DATE_OBJECT"
1980 
1981  ! ALLOCATE THE NEW FILE OBJECT
1982  ncf => new_file()
1983 
1984  ! FILE_DATE
1985  var => nc_make_pvar(name='file_date', values=data_vec, dim1= dim_datestrlen, dim2 = dim_time)
1986  var%SCL_CHR => var%VEC_CHR(1)
1987 
1988  IF(use_real_world_time) THEN
1989  att => nc_make_att(name='time_zone',values=trim(timezone))
1990  ELSE
1991  att => nc_make_att(name='time_zone',values="UTC")
1992  END IF
1993 
1994  var => add(var,att)
1995 
1996  ncf => add(ncf,var)
1997 
1998  END FUNCTION file_date_object
1999 
2000 
2001 !=============================================================
2002  FUNCTION velocity_file_object() RESULT(NCF)
2003  IMPLICIT NONE
2004 
2005  INTEGER :: status
2006  LOGICAL, SAVE :: ioproc_allocated = .false.
2007  TYPE(ncfile), POINTER :: ncf
2008  TYPE(ncvar), POINTER :: var
2009  TYPE(ncatt), POINTER :: att
2010 
2011  character(len=100) :: timestamp, temp, netcdf_convention
2012 
2013  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START VELOCITY_FILE_OBJECT"
2014 
2015  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2016  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2017  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2018  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2019 
2020  ioproc_allocated = .true.
2021 
2022  allocate(u(ngl,kb),stat=status)
2023  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:U")
2024  u = 0.0_sp
2025 
2026  allocate(v(ngl,kb),stat=status)
2027  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:V")
2028  v = 0.0_sp
2029 
2030  allocate(taubm(ngl),stat=status)
2031  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:WUBOT")
2032  taubm = 0.0_sp
2033 
2034  END IF
2035 
2036 
2037  ! ALLOCATE THE NEW FILE OBJECT
2038  ncf => new_file()
2039 
2040 
2041  ! U
2042  var => nc_make_avar(name='u',&
2043  & values=u, dim1= dim_nele, dim2= dim_siglay, dim3 = dim_time)
2044 
2045  att => nc_make_att(name='long_name',values='Eastward Water Velocity')
2046  var => add(var,att)
2047 
2048  att => nc_make_att(name='standard_name',values='eastward_sea_water_velocity')
2049  var => add(var,att)
2050 
2051  att => nc_make_att(name='units',values='meters s-1')
2052  var => add(var,att)
2053 
2054  att => nc_make_att(name='grid',values='fvcom_grid')
2055  var => add(var,att)
2056 
2057  att => nc_make_att(name='type',values='data')
2058  var => add(var,att)
2059 
2060  att => nc_make_att(name='coordinates',values='time siglay latc lonc')
2061  var => add(var,att)
2062 
2063  att => nc_make_att(name='mesh',values='fvcom_mesh')
2064  var => add(var,att)
2065 
2066  att => nc_make_att(name='location',values='face')
2067  var => add(var,att)
2068 
2069  ncf => add(ncf,var)
2070 
2071 
2072 
2073  ! V
2074  var => nc_make_avar(name='v',&
2075  & values=v, dim1= dim_nele, dim2= dim_siglay, dim3 = dim_time)
2076 
2077  att => nc_make_att(name='long_name',values='Northward Water Velocity')
2078  var => add(var,att)
2079 
2080  att => nc_make_att(name='standard_name',values='Northward_sea_water_velocity')
2081  var => add(var,att)
2082 
2083  att => nc_make_att(name='units',values='meters s-1')
2084  var => add(var,att)
2085 
2086  att => nc_make_att(name='grid',values='fvcom_grid')
2087  var => add(var,att)
2088 
2089  att => nc_make_att(name='type',values='data')
2090  var => add(var,att)
2091 
2092  att => nc_make_att(name='coordinates',values='time siglay latc lonc')
2093  var => add(var,att)
2094 
2095  att => nc_make_att(name='mesh',values='fvcom_mesh')
2096  var => add(var,att)
2097 
2098  att => nc_make_att(name='location',values='face')
2099  var => add(var,att)
2100 
2101  ncf => add(ncf,var)
2102 
2103  var => nc_make_avar(name='tauc',&
2104  & values=taubm, dim1= dim_nele, dim2= dim_time)
2105 
2106  att => nc_make_att(name='long_name',values='bed stress magnitude from currents')
2107  var => add(var,att)
2108 
2109  att => nc_make_att(name='note1',values='this stress is bottom boundary condtion on velocity field')
2110  var => add(var,att)
2111 
2112  att => nc_make_att(name='note2',values='dimensions are stress/rho')
2113  var => add(var,att)
2114 
2115  att => nc_make_att(name='units',values='m^2 s^-2')
2116  var => add(var,att)
2117 
2118  att => nc_make_att(name='grid',values='fvcom_grid')
2119  var => add(var,att)
2120 
2121  att => nc_make_att(name='type',values='data')
2122  var => add(var,att)
2123 
2124  att => nc_make_att(name='coordinates',values='time latc lonc')
2125  var => add(var,att)
2126 
2127  att => nc_make_att(name='mesh',values='fvcom_mesh')
2128  var => add(var,att)
2129 
2130  att => nc_make_att(name='location',values='face')
2131  var => add(var,att)
2132 
2133  ncf => add(ncf,var)
2134 
2135 
2136  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END VELOCITY_FILE_OBJECT"
2137 
2138  END FUNCTION velocity_file_object
2139 !=============================================================
2140  FUNCTION vorticity_file_object() RESULT(NCF)
2141  IMPLICIT NONE
2142 
2143  INTEGER :: status
2144  LOGICAL, SAVE :: ioproc_allocated = .false.
2145  TYPE(ncfile), POINTER :: ncf
2146  TYPE(ncvar), POINTER :: var
2147  TYPE(ncatt), POINTER :: att
2148 
2149  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START VORTIICTY_FILE_OBJECT"
2150 
2151  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2152  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2153  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2154  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2155 
2156  ioproc_allocated = .true.
2157 
2158  allocate(vort(mgl),stat=status)
2159  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:VORT")
2160  vort = 0.0_sp
2161 
2162  END IF
2163 
2164 
2165  ! ALLOCATE THE NEW FILE OBJECT
2166  ncf => new_file()
2167 
2168 
2169  ! VORTICITY
2170  var => nc_make_avar(name='vorticity',&
2171  & values=vort, dim1= dim_node, dim2= dim_time)
2172 
2173  att => nc_make_att(name='long_name',values='Ertels 2d potential vorticity')
2174  var => add(var,att)
2175 
2176  att => nc_make_att(name='units',values='s-1')
2177  var => add(var,att)
2178 
2179  att => nc_make_att(name='grid',values='fvcom_grid')
2180  var => add(var,att)
2181 
2182  att => nc_make_att(name='type',values='data')
2183  var => add(var,att)
2184 
2185  ncf => add(ncf,var)
2186 
2187 
2188 
2189  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END VORTICITY_FILE_OBJECT"
2190 
2191  END FUNCTION vorticity_file_object
2192 !=============================================================
2193  FUNCTION average_vel_file_object() RESULT(NCF)
2194  IMPLICIT NONE
2195 
2196  INTEGER :: status
2197  LOGICAL, SAVE :: ioproc_allocated = .false.
2198  TYPE(ncfile), POINTER :: ncf
2199  TYPE(ncvar), POINTER :: var
2200  TYPE(ncatt), POINTER :: att
2201 
2202  character(len=100) :: timestamp, temp, netcdf_convention
2203 
2204  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START AVERAGE_VEL_FILE_OBJECT"
2205 
2206  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2207  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2208  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2209  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2210 
2211  ioproc_allocated = .true.
2212 
2213  allocate(ua(ngl),stat=status)
2214  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:UA")
2215  ua = 0.0_sp
2216 
2217  allocate(va(ngl),stat=status)
2218  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:VA")
2219  va = 0.0_sp
2220 
2221  END IF
2222 
2223 
2224  ! ALLOCATE THE NEW FILE OBJECT
2225  ncf => new_file()
2226 
2227 
2228  ! UA
2229  var => nc_make_avar(name='ua',&
2230  & values=ua, dim1= dim_nele, dim2= dim_time)
2231 
2232  att => nc_make_att(name='long_name',values='Vertically Averaged x-velocity')
2233  var => add(var,att)
2234 
2235  att => nc_make_att(name='units',values='meters s-1')
2236  var => add(var,att)
2237 
2238  att => nc_make_att(name='grid',values='fvcom_grid')
2239  var => add(var,att)
2240 
2241  att => nc_make_att(name='type',values='data')
2242  var => add(var,att)
2243 
2244  ncf => add(ncf,var)
2245 
2246 
2247  ! VA
2248  var => nc_make_avar(name='va',&
2249  & values=va, dim1= dim_nele, dim2= dim_time)
2250 
2251  att => nc_make_att(name='long_name',values='Vertically Averaged y-velocity')
2252  var => add(var,att)
2253 
2254  att => nc_make_att(name='units',values='meters s-1')
2255  var => add(var,att)
2256 
2257  att => nc_make_att(name='grid',values='fvcom_grid')
2258  var => add(var,att)
2259 
2260  att => nc_make_att(name='type',values='data')
2261  var => add(var,att)
2262 
2263  ncf => add(ncf,var)
2264 
2265 
2266  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END AVERAGE_VEL_FILE_OBJECT"
2267 
2268  END FUNCTION average_vel_file_object
2269 
2270 !=============================================================
2271  FUNCTION vertical_vel_file_object() RESULT(NCF)
2272  IMPLICIT NONE
2273 
2274  INTEGER :: status
2275  LOGICAL, SAVE :: ioproc_allocated = .false.
2276  TYPE(ncfile), POINTER :: ncf
2277  TYPE(ncvar), POINTER :: var
2278  TYPE(ncatt), POINTER :: att
2279 
2280  character(len=100) :: timestamp, temp, netcdf_convention
2281 
2282  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START VERTICAL_VEL_FILE_OBJECT"
2283 
2284  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2285  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2286  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2287  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2288 
2289  ioproc_allocated = .true.
2290 
2291  allocate(ww(ngl,kb),stat=status)
2292  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:WW")
2293  ww = 0.0_sp
2294 
2295  allocate(wts(mgl,kb),stat=status)
2296  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:WTS")
2297  wts = 0.0_sp
2298 
2299  END IF
2300 
2301 
2302  ! ALLOCATE THE NEW FILE OBJECT
2303  ncf => new_file()
2304 
2305 
2306  ! WTS
2307  var => nc_make_avar(name='omega',&
2308  & values=wts, dim1= dim_node, dim2= dim_siglev, dim3 = dim_time)
2309 
2310  att => nc_make_att(name='long_name',values='Vertical Sigma Coordinate Velocity')
2311  var => add(var,att)
2312 
2313  att => nc_make_att(name='units',values='s-1')
2314  var => add(var,att)
2315 
2316  att => nc_make_att(name='grid',values='fvcom_grid')
2317  var => add(var,att)
2318 
2319  att => nc_make_att(name='type',values='data')
2320  var => add(var,att)
2321 
2322  ncf => add(ncf,var)
2323 
2324 
2325 
2326  ! WW
2327  var => nc_make_avar(name='ww',&
2328  & values=ww, dim1= dim_nele, dim2= dim_siglay, dim3 = dim_time)
2329 
2330  att => nc_make_att(name='long_name',values='Upward Water Velocity')
2331  var => add(var,att)
2332 
2333  att => nc_make_att(name='units',values='meters s-1')
2334  var => add(var,att)
2335 
2336  att => nc_make_att(name='grid',values='fvcom_grid')
2337  var => add(var,att)
2338 
2339  att => nc_make_att(name='type',values='data')
2340  var => add(var,att)
2341 
2342  ncf => add(ncf,var)
2343 
2344  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END VERTICAL_VEL_FILE_OBJECT"
2345 
2346  END FUNCTION vertical_vel_file_object
2347 !=============================================================
2348  FUNCTION salt_temp_file_object() RESULT(NCF)
2349  IMPLICIT NONE
2350 
2351  INTEGER :: status
2352  LOGICAL, SAVE :: ioproc_allocated = .false.
2353  TYPE(ncfile), POINTER :: ncf
2354  TYPE(ncvar), POINTER :: var
2355  TYPE(ncatt), POINTER :: att
2356 
2357  character(len=100) :: timestamp, temp, netcdf_convention
2358 
2359  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START SALT_TEMP_FILE_OBJECT"
2360 
2361  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2362  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2363  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2364  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2365 
2366  ioproc_allocated = .true.
2367 
2368  allocate(t1(mgl,kb),stat=status)
2369  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:T1")
2370  t1 = 0.0_sp
2371 
2372  allocate(s1(mgl,kb),stat=status)
2373  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:S1")
2374  s1 = 0.0_sp
2375 
2376  END IF
2377 
2378 
2379  ! ALLOCATE THE NEW FILE OBJECT
2380  ncf => new_file()
2381 
2382 
2383  ! T
2384  var => nc_make_avar(name='temp',&
2385  & values=t1, dim1= dim_node, dim2= dim_siglay, dim3 = dim_time)
2386 
2387  att => nc_make_att(name='long_name',values='temperature')
2388  var => add(var,att)
2389 
2390  att => nc_make_att(name='standard_name',values='sea_water_temperature')
2391  var => add(var,att)
2392 
2393  att => nc_make_att(name='units',values='degrees_C')
2394  var => add(var,att)
2395 
2396  att => nc_make_att(name='grid',values='fvcom_grid')
2397  var => add(var,att)
2398 
2399 !!$ ATT => NC_MAKE_ATT(name='coordinates',values=CoordVar)
2400  att => nc_make_att(name='coordinates',values='time siglay lat lon')
2401  var => add(var,att)
2402 
2403  att => nc_make_att(name='type',values='data')
2404  var => add(var,att)
2405 
2406  att => nc_make_att(name='mesh',values='fvcom_mesh')
2407  var => add(var,att)
2408 
2409  att => nc_make_att(name='location',values='node')
2410  var => add(var,att)
2411 
2412  ncf => add(ncf,var)
2413 
2414 
2415  ! S
2416  var => nc_make_avar(name='salinity',&
2417  & values=s1, dim1= dim_node, dim2= dim_siglay, dim3 = dim_time)
2418 
2419  att => nc_make_att(name='long_name',values='salinity')
2420  var => add(var,att)
2421 
2422  att => nc_make_att(name='standard_name',values='sea_water_salinity')
2423  var => add(var,att)
2424 
2425 
2426  att => nc_make_att(name='units',values='1e-3')
2427  var => add(var,att)
2428 
2429  att => nc_make_att(name='grid',values='fvcom_grid')
2430  var => add(var,att)
2431 
2432 !!$ ATT => NC_MAKE_ATT(name='coordinates',values=CoordVar)
2433  att => nc_make_att(name='coordinates',values='time siglay lat lon')
2434  var => add(var,att)
2435 
2436  att => nc_make_att(name='type',values='data')
2437  var => add(var,att)
2438 
2439  att => nc_make_att(name='mesh',values='fvcom_mesh')
2440  var => add(var,att)
2441 
2442  att => nc_make_att(name='location',values='node')
2443  var => add(var,att)
2444 
2445  ncf => add(ncf,var)
2446 
2447 
2448  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END SALT_TEMP_FILE_OBJECT"
2449 
2450  END FUNCTION salt_temp_file_object
2451 !=============================================================
2452  FUNCTION density_file_object() RESULT(NCF)
2453  IMPLICIT NONE
2454 
2455  INTEGER :: status
2456  LOGICAL, SAVE :: ioproc_allocated = .false.
2457  TYPE(ncfile), POINTER :: ncf
2458  TYPE(ncvar), POINTER :: var
2459  TYPE(ncatt), POINTER :: att
2460 
2461  character(len=100) :: timestamp, temp, netcdf_convention
2462 
2463  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START DENSITY_FILE_OBJECT"
2464 
2465  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2466  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2467  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2468  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2469 
2470  ioproc_allocated = .true.
2471 
2472  allocate(rho1(mgl,kb),stat=status)
2473  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:RHO1")
2474  rho1 = 0.0_sp
2475 
2476  allocate(rmean1(mgl,kb),stat=status)
2477  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:RMEAN1")
2478  rmean1 = 0.0_sp
2479 
2480  END IF
2481 
2482 
2483  ! ALLOCATE THE NEW FILE OBJECT
2484  ncf => new_file()
2485 
2486 
2487  ! DENSITY
2488  var => nc_make_avar(name='rho1',&
2489  & values=rho1, dim1= dim_node, dim2= dim_siglay, dim3 = dim_time)
2490 
2491  att => nc_make_att(name='long_name',values='density')
2492  var => add(var,att)
2493 
2494  att => nc_make_att(name='standard_name',values='sea_water_density')
2495  var => add(var,att)
2496 
2497  att => nc_make_att(name='units',values='kg/m3')
2498  var => add(var,att)
2499 
2500  att => nc_make_att(name='grid',values='fvcom_grid')
2501  var => add(var,att)
2502 
2503  att => nc_make_att(name='coordinates',values=coordvar)
2504  var => add(var,att)
2505 
2506  att => nc_make_att(name='type',values='data')
2507  var => add(var,att)
2508 
2509  ncf => add(ncf,var)
2510 
2511 
2512  ! RMEAN1
2513  var => nc_make_avar(name='rmean1',&
2514  & values=rmean1, dim1= dim_node, dim2= dim_siglay)
2515 
2516  att => nc_make_att(name='long_name',values='mean density')
2517  var => add(var,att)
2518 
2519  att => nc_make_att(name='standard_name',values='sea_water_density')
2520  var => add(var,att)
2521 
2522  att => nc_make_att(name='units',values='kg/m3')
2523  var => add(var,att)
2524 
2525  att => nc_make_att(name='grid',values='SigmaLayer_Mesh')
2526  var => add(var,att)
2527 
2528  att => nc_make_att(name='type',values='data')
2529  var => add(var,att)
2530 
2531  ncf => add(ncf,var)
2532 
2533 
2534  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END DENSITY_FILE_OBJECT"
2535 
2536  END FUNCTION density_file_object
2537 !=============================================================
2538  FUNCTION turbulence_file_object() RESULT(NCF)
2539  IMPLICIT NONE
2540 
2541  INTEGER :: status
2542  LOGICAL, SAVE :: ioproc_allocated = .false.
2543  TYPE(ncfile), POINTER :: ncf
2544  TYPE(ncvar), POINTER :: var
2545  TYPE(ncatt), POINTER :: att
2546  TYPE(ncdim), POINTER :: dim1
2547  TYPE(ncdim), POINTER :: dim2
2548  TYPE(ncdim), POINTER :: dim3
2549 
2550  character(len=100) :: timestamp, temp, netcdf_convention
2551 
2552  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START TURBULENCE_FILE_OBJECT"
2553 
2554  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2555  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2556  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2557  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2558 
2559  ioproc_allocated = .true.
2560 
2561  allocate(viscofm(ngl,kb),stat=status)
2562  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:VISCOFM")
2563  viscofm = 0.0_sp
2564 
2565  allocate(viscofh(mgl,kb),stat=status)
2566  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:VISCOFH")
2567  viscofh = 0.0_sp
2568 
2569  allocate(km(mgl,kb),stat=status)
2570  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:KM")
2571  km = 0.0_sp
2572 
2573  allocate(kh(mgl,kb),stat=status)
2574  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:KH")
2575  kh = 0.0_sp
2576 
2577  allocate(kq(mgl,kb),stat=status)
2578  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:KQ")
2579  kq = 0.0_sp
2580 
2581  allocate(q2(mgl,kb),stat=status)
2582  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:Q2")
2583  q2 = 0.0_sp
2584 
2585  allocate(q2l(mgl,kb),stat=status)
2586  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:Q2L")
2587  q2l = 0.0_sp
2588 
2589  allocate(l(mgl,kb),stat=status)
2590  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:L")
2591  l = 0.0_sp
2592 
2593 
2594  END IF
2595 
2596 
2597  ! ALLOCATE THE NEW FILE OBJECT
2598  ncf => new_file()
2599 
2600 
2601  ! VISCOFM
2602  var => nc_make_avar(name='viscofm',&
2603  & values=viscofm, dim1= dim_nele, dim2= dim_siglay, dim3 = dim_time)
2604 
2605  att => nc_make_att(name='long_name',values='Horizontal Turbulent Eddy Viscosity For Momentum')
2606  var => add(var,att)
2607 
2608  att => nc_make_att(name='units',values='m 2 s-1')
2609  var => add(var,att)
2610 
2611  att => nc_make_att(name='grid',values='fvcom_grid')
2612  var => add(var,att)
2613 
2614  att => nc_make_att(name='coordinates',values=coordvar)
2615  var => add(var,att)
2616 
2617  att => nc_make_att(name='type',values='data')
2618  var => add(var,att)
2619 
2620  ncf => add(ncf,var)
2621 
2622  ! VISCOFH
2623  var => nc_make_avar(name='viscofh',&
2624  & values=viscofh, dim1= dim_node, dim2= dim_siglay, dim3 = dim_time)
2625 
2626  att => nc_make_att(name='long_name',values='Horizontal Turbulent Eddy Viscosity For Scalars')
2627  var => add(var,att)
2628 
2629  att => nc_make_att(name='units',values='m 2 s-1')
2630  var => add(var,att)
2631 
2632  att => nc_make_att(name='grid',values='fvcom_grid')
2633  var => add(var,att)
2634 
2635  att => nc_make_att(name='coordinates',values=coordvar)
2636  var => add(var,att)
2637 
2638  att => nc_make_att(name='type',values='data')
2639  var => add(var,att)
2640 
2641  ncf => add(ncf,var)
2642 
2643  ! KM
2644  var => nc_make_avar(name='km',&
2645  & values=km, dim1= dim_node, dim2= dim_siglev, dim3 = dim_time)
2646 
2647  att => nc_make_att(name='long_name',values='Turbulent Eddy Viscosity For Momentum')
2648  var => add(var,att)
2649 
2650  att => nc_make_att(name='units',values='m 2 s-1')
2651  var => add(var,att)
2652 
2653  att => nc_make_att(name='grid',values='fvcom_grid')
2654  var => add(var,att)
2655 
2656  att => nc_make_att(name='coordinates',values=coordvar)
2657  var => add(var,att)
2658 
2659  att => nc_make_att(name='type',values='data')
2660  var => add(var,att)
2661 
2662  ncf => add(ncf,var)
2663 
2664  ! KH
2665  var => nc_make_avar(name='kh',&
2666  & values=kh, dim1= dim_node, dim2= dim_siglev, dim3 = dim_time)
2667 
2668  att => nc_make_att(name='long_name',values='Turbulent Eddy Viscosity For Scalars')
2669  var => add(var,att)
2670 
2671  att => nc_make_att(name='units',values='m 2 s-1')
2672  var => add(var,att)
2673 
2674  att => nc_make_att(name='grid',values='fvcom_grid')
2675  var => add(var,att)
2676 
2677  att => nc_make_att(name='coordinates',values=coordvar)
2678  var => add(var,att)
2679 
2680  att => nc_make_att(name='type',values='data')
2681  var => add(var,att)
2682 
2683  ncf => add(ncf,var)
2684 
2685  ! KQ
2686  var => nc_make_avar(name='kq',&
2687  & values=kq, dim1= dim_node, dim2= dim_siglev, dim3 = dim_time)
2688 
2689  att => nc_make_att(name='long_name',values='Turbulent Eddy Viscosity For Q2/Q2L')
2690  var => add(var,att)
2691 
2692  att => nc_make_att(name='units',values='m 2 s-1')
2693  var => add(var,att)
2694 
2695  att => nc_make_att(name='grid',values='fvcom_grid')
2696  var => add(var,att)
2697 
2698  att => nc_make_att(name='coordinates',values=coordvar)
2699  var => add(var,att)
2700 
2701  att => nc_make_att(name='type',values='data')
2702  var => add(var,att)
2703 
2704  ncf => add(ncf,var)
2705 
2706  ! Q2
2707  var => nc_make_avar(name='q2',&
2708  & values=q2, dim1= dim_node, dim2= dim_siglev, dim3 = dim_time)
2709 
2710  att => nc_make_att(name='long_name',values='Turbulent Kinetic Energy')
2711  var => add(var,att)
2712 
2713  att => nc_make_att(name='units',values='m2 s-2')
2714  var => add(var,att)
2715 
2716  att => nc_make_att(name='grid',values='fvcom_grid')
2717  var => add(var,att)
2718 
2719  att => nc_make_att(name='coordinates',values=coordvar)
2720  var => add(var,att)
2721 
2722  att => nc_make_att(name='type',values='data')
2723  var => add(var,att)
2724 
2725  ncf => add(ncf,var)
2726 
2727  ! Q2L
2728  var => nc_make_avar(name='q2l',&
2729  & values=q2l, dim1= dim_node, dim2= dim_siglev, dim3 = dim_time)
2730 
2731  att => nc_make_att(name='long_name',values='Turbulent Kinetic Ene&
2732  &rgy X Turbulent Macroscale')
2733  var => add(var,att)
2734 
2735  att => nc_make_att(name='units',values='m3 s-2')
2736  var => add(var,att)
2737 
2738  att => nc_make_att(name='grid',values='fvcom_grid')
2739  var => add(var,att)
2740 
2741  att => nc_make_att(name='coordinates',values=coordvar)
2742  var => add(var,att)
2743 
2744  att => nc_make_att(name='type',values='data')
2745  var => add(var,att)
2746 
2747  ncf => add(ncf,var)
2748 
2749  ! L
2750  var => nc_make_avar(name='l',&
2751  & values=l, dim1= dim_node, dim2= dim_siglev, dim3 = dim_time)
2752 
2753  att => nc_make_att(name='long_name',values='Turbulent Macroscale')
2754  var => add(var,att)
2755 
2756  att => nc_make_att(name='units',values='m3 s-2')
2757  var => add(var,att)
2758 
2759  att => nc_make_att(name='grid',values='fvcom_grid')
2760  var => add(var,att)
2761 
2762  att => nc_make_att(name='coordinates',values=coordvar)
2763  var => add(var,att)
2764 
2765  att => nc_make_att(name='type',values='data')
2766  var => add(var,att)
2767 
2768  ncf => add(ncf,var)
2769 
2770 
2771  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END TURBULENCE_FILE_OBJECT"
2772 
2773  END FUNCTION turbulence_file_object
2774 !=============================================================
2775  FUNCTION surface_heating_file_object() RESULT(NCF)
2776  IMPLICIT NONE
2777 
2778  INTEGER :: status
2779  LOGICAL, SAVE :: ioproc_allocated = .false.
2780  TYPE(ncfile), POINTER :: ncf
2781  TYPE(ncvar), POINTER :: var
2782  TYPE(ncatt), POINTER :: att
2783 
2784  character(len=100) :: timestamp, temp, netcdf_convention
2785 
2786  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START SURFACE_HEATING_FILE_OBJECT"
2787 
2788  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2789  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2790  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2791  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2792 
2793  ioproc_allocated = .true.
2794 
2795  allocate(swrad_watts(mgl),stat=status)
2796  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:SWRAD")
2797  swrad_watts = 0.0_sp
2798 
2799  allocate(wtsurf_watts(mgl),stat=status)
2800  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:WTSURF")
2801  wtsurf_watts = 0.0_sp
2802 
2803  END IF
2804 
2805 
2806  ! ALLOCATE THE NEW FILE OBJECT
2807  ncf => new_file()
2808 
2809 
2810  ! SWRAD
2811  var => nc_make_avar(name='short_wave',&
2812  & values=swrad_watts, dim1= dim_node, dim2= dim_time)
2813 
2814  att => nc_make_att(name='long_name',values='Short Wave Radiation')
2815  var => add(var,att)
2816 
2817  att => nc_make_att(name='units',values='W m-2')
2818  var => add(var,att)
2819 
2820  att => nc_make_att(name='grid',values='fvcom_grid')
2821  var => add(var,att)
2822 
2823 !!$ ATT => NC_MAKE_ATT(name='coordinates',values=CoordVar)
2824  att => nc_make_att(name='coordinates',values='time lat lon')
2825  var => add(var,att)
2826 
2827  att => nc_make_att(name='type',values='data')
2828  var => add(var,att)
2829 
2830  att => nc_make_att(name='mesh',values='fvcom_mesh')
2831  var => add(var,att)
2832 
2833  att => nc_make_att(name='location',values='node')
2834  var => add(var,att)
2835 
2836  ncf => add(ncf,var)
2837 
2838  ! WTSURF - NET HEAT FLUX
2839  var => nc_make_avar(name='net_heat_flux',&
2840  & values=wtsurf_watts, dim1= dim_node, dim2= dim_time)
2841 
2842  att => nc_make_att(name='long_name',values='Surface Net Heat Flux')
2843  var => add(var,att)
2844 
2845  att => nc_make_att(name='units',values='W m-2')
2846  var => add(var,att)
2847 
2848  att => nc_make_att(name='grid',values='fvcom_grid')
2849  var => add(var,att)
2850 
2851 !!$ ATT => NC_MAKE_ATT(name='coordinates',values=CoordVar)
2852  att => nc_make_att(name='coordinates',values='time lat lon')
2853  var => add(var,att)
2854 
2855  att => nc_make_att(name='type',values='data')
2856  var => add(var,att)
2857 
2858  att => nc_make_att(name='mesh',values='fvcom_mesh')
2859  var => add(var,att)
2860 
2861  att => nc_make_att(name='location',values='node')
2862  var => add(var,att)
2863 
2864  ncf => add(ncf,var)
2865 
2866  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END SURFACE_HEATING_FILE_OBJECT"
2867 
2868  END FUNCTION surface_heating_file_object
2869 !=============================================================
2870  FUNCTION wind_velocity_file_object() RESULT(NCF)
2871  IMPLICIT NONE
2872 
2873  INTEGER :: status
2874  LOGICAL, SAVE :: ioproc_allocated = .false.
2875  TYPE(ncfile), POINTER :: ncf
2876  TYPE(ncvar), POINTER :: var
2877  TYPE(ncatt), POINTER :: att
2878 
2879  character(len=100) :: timestamp, temp, netcdf_convention
2880 
2881  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START WIND_VELOCITY_FILE_OBJECT"
2882 
2883  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2884  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2885  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2886  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2887 
2888  ioproc_allocated = .true.
2889 
2890  allocate(uuwind(ngl),stat=status)
2891  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:UUWIND")
2892  uuwind = 0.0_sp
2893 
2894  allocate(vvwind(ngl),stat=status)
2895  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:VVWIND")
2896  vvwind = 0.0_sp
2897 
2898  END IF
2899 
2900 
2901  ! ALLOCATE THE NEW FILE OBJECT
2902  ncf => new_file()
2903 
2904 
2905  ! UUWIND
2906  var => nc_make_avar(name='uwind_speed',&
2907  & values=uuwind, dim1= dim_nele, dim2= dim_time)
2908 
2909  att => nc_make_att(name='long_name',values='Eastward Wind Velocity')
2910  var => add(var,att)
2911 
2912  att => nc_make_att(name='standard_name',values='eastward wind')
2913  var => add(var,att)
2914 
2915  att => nc_make_att(name='units',values='meters s-1')
2916  var => add(var,att)
2917 
2918  att => nc_make_att(name='grid',values='fvcom_grid')
2919  var => add(var,att)
2920 
2921  att => nc_make_att(name='coordinates',values='time latc lonc')
2922  var => add(var,att)
2923 
2924  att => nc_make_att(name='type',values='data')
2925  var => add(var,att)
2926 
2927  att => nc_make_att(name='mesh',values='fvcom_mesh')
2928  var => add(var,att)
2929 
2930  att => nc_make_att(name='location',values='face')
2931  var => add(var,att)
2932 
2933  ncf => add(ncf,var)
2934 
2935  ! VVWIND
2936  var => nc_make_avar(name='vwind_speed',&
2937  & values=vvwind, dim1= dim_nele, dim2= dim_time)
2938 
2939  att => nc_make_att(name='long_name',values='Northward Wind Velocity')
2940  var => add(var,att)
2941 
2942  att => nc_make_att(name='standard_name',values='northward wind')
2943  var => add(var,att)
2944 
2945  att => nc_make_att(name='units',values='meters s-1')
2946  var => add(var,att)
2947 
2948  att => nc_make_att(name='grid',values='fvcom_grid')
2949  var => add(var,att)
2950 
2951  att => nc_make_att(name='coordinates',values='time latc lonc')
2952  var => add(var,att)
2953 
2954  att => nc_make_att(name='type',values='data')
2955  var => add(var,att)
2956 
2957  att => nc_make_att(name='mesh',values='fvcom_mesh')
2958  var => add(var,att)
2959 
2960  att => nc_make_att(name='location',values='face')
2961  var => add(var,att)
2962 
2963  ncf => add(ncf,var)
2964 
2965 
2966  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END WIND_VELOCITY_FILE_OBJECT"
2967 
2968  END FUNCTION wind_velocity_file_object
2969 !=============================================================
2970 !=============================================================
2971  FUNCTION wind_stress_file_object() RESULT(NCF)
2972  IMPLICIT NONE
2973 
2974  INTEGER :: status
2975  LOGICAL, SAVE :: ioproc_allocated = .false.
2976  TYPE(ncfile), POINTER :: ncf
2977  TYPE(ncvar), POINTER :: var
2978  TYPE(ncatt), POINTER :: att
2979 
2980  character(len=100) :: timestamp, temp, netcdf_convention
2981 
2982  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START WIND_STRESS_FILE_OBJECT"
2983 
2984  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
2985  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
2986  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
2987  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
2988 
2989  ioproc_allocated = .true.
2990 
2991  allocate(wusurf_save(ngl),stat=status)
2992  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:WUSURF")
2993  wusurf_save = 0.0_sp
2994 
2995  allocate(wvsurf_save(ngl),stat=status)
2996  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:WVSURF")
2997  wvsurf_save = 0.0_sp
2998 
2999  END IF
3000 
3001 
3002  ! ALLOCATE THE NEW FILE OBJECT
3003  ncf => new_file()
3004 
3005 
3006  ! UUWIND
3007  var => nc_make_avar(name='uwind_stress',&
3008  & values=wusurf_save, dim1= dim_nele, dim2= dim_time)
3009 
3010  att => nc_make_att(name='long_name',values='Eastward Wind Stress')
3011  var => add(var,att)
3012 
3013  att => nc_make_att(name='standard_name',values='Wind Stress')
3014  var => add(var,att)
3015 
3016  att => nc_make_att(name='units',values='Pa')
3017  var => add(var,att)
3018 
3019  att => nc_make_att(name='grid',values='fvcom_grid')
3020  var => add(var,att)
3021 
3022  att => nc_make_att(name='type',values='data')
3023  var => add(var,att)
3024 
3025  ncf => add(ncf,var)
3026 
3027  ! VVWIND
3028  var => nc_make_avar(name='vwind_stress',&
3029  & values=wvsurf_save, dim1= dim_nele, dim2= dim_time)
3030 
3031  att => nc_make_att(name='long_name',values='Northward Wind Stress')
3032  var => add(var,att)
3033 
3034  att => nc_make_att(name='standard_name',values='Wind Stress')
3035  var => add(var,att)
3036 
3037  att => nc_make_att(name='units',values='Pa')
3038  var => add(var,att)
3039 
3040  att => nc_make_att(name='grid',values='fvcom_grid')
3041  var => add(var,att)
3042 
3043  att => nc_make_att(name='type',values='data')
3044  var => add(var,att)
3045 
3046  ncf => add(ncf,var)
3047 
3048 
3049  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END WIND_STRESS_FILE_OBJECT"
3050 
3051  END FUNCTION wind_stress_file_object
3052 !=============================================================
3053 !=============================================================
3054  FUNCTION precipitation_file_object() RESULT(NCF)
3055  IMPLICIT NONE
3056 
3057  INTEGER :: status
3058  LOGICAL, SAVE :: ioproc_allocated = .false.
3059  TYPE(ncfile), POINTER :: ncf
3060  TYPE(ncvar), POINTER :: var
3061  TYPE(ncatt), POINTER :: att
3062  TYPE(ncdim), POINTER :: dim1
3063  TYPE(ncdim), POINTER :: dim2
3064  TYPE(ncdim), POINTER :: dim3
3065 
3066  character(len=100) :: timestamp, temp, netcdf_convention
3067 
3068  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START PRECIPITATION_FILE_OBJECT"
3069 
3070  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
3071  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
3072  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
3073  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
3074 
3075  ioproc_allocated = .true.
3076 
3077  allocate(qprec(mgl),stat=status)
3078  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:QPREC2")
3079  qprec = 0.0_sp
3080 
3081  allocate(qevap(mgl),stat=status)
3082  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:QEVAP2")
3083  qevap = 0.0_sp
3084 
3085  END IF
3086 
3087 
3088  ! ALLOCATE THE NEW FILE OBJECT
3089  ncf => new_file()
3090 
3091 
3092  ! PRECIPITATION
3093  var => nc_make_avar(name='precip',&
3094  & values=qprec, dim1= dim_node, dim2= dim_time)
3095 
3096  att => nc_make_att(name='long_name',values='Precipitation')
3097  var => add(var,att)
3098 
3099  att => nc_make_att(name='description',values='Precipitation, ocean &
3100  &lose water is negative')
3101  var => add(var,att)
3102 
3103  att => nc_make_att(name='units',values='m s-1')
3104  var => add(var,att)
3105 
3106  att => nc_make_att(name='grid',values='fvcom_grid')
3107  var => add(var,att)
3108 
3109  att => nc_make_att(name='coordinates',values=coordvar)
3110  var => add(var,att)
3111 
3112  att => nc_make_att(name='type',values='data')
3113  var => add(var,att)
3114 
3115  ncf => add(ncf,var)
3116 
3117  ! EVAPORATION
3118  var => nc_make_avar(name='evap',&
3119  & values=qevap, dim1= dim_node, dim2= dim_time)
3120 
3121  att => nc_make_att(name='long_name',values='Evaporation')
3122  var => add(var,att)
3123 
3124  att => nc_make_att(name='description',values='Evaporation, ocean &
3125  &lose water is negative')
3126  var => add(var,att)
3127 
3128  att => nc_make_att(name='units',values='m s-1')
3129  var => add(var,att)
3130 
3131  att => nc_make_att(name='grid',values='fvcom_grid')
3132  var => add(var,att)
3133 
3134  att => nc_make_att(name='coordinates',values=coordvar)
3135  var => add(var,att)
3136 
3137  att => nc_make_att(name='type',values='data')
3138  var => add(var,att)
3139 
3140  ncf => add(ncf,var)
3141 
3142 
3143  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END PRECIPITATION_FILE_OBJECT"
3144 
3145  END FUNCTION precipitation_file_object
3146 
3147 !=============================================================
3148 !=============================================================
3149 !=============================================================
3150  FUNCTION restart_extras_file_object() RESULT(NCF)
3151  USE bcs
3152  IMPLICIT NONE
3153 
3154  INTEGER :: status
3155  LOGICAL, SAVE :: ioproc_allocated = .false.
3156  TYPE(ncfile), POINTER :: ncf
3157  TYPE(ncvar), POINTER :: var
3158  TYPE(ncatt), POINTER :: att
3159 
3160  character(len=100) :: timestamp, temp, netcdf_convention
3161 
3162  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START RESTART_EXTRAS_FILE_OBJECT"
3163 
3164  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
3165  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
3166  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
3167  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
3168 
3169  ioproc_allocated = .true.
3170 
3171  allocate(cor(ngl),stat=status)
3172  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:COR")
3173  cor = 0.0_sp
3174 
3175  allocate(cc_sponge(ngl),stat=status)
3176  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:CC_SPONGE")
3177  cc_sponge = 0.0_sp
3178 
3179  allocate(et(mgl),stat=status)
3180  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:EL")
3181  et = 0.0_sp
3182 
3183 
3184 ! OPEN BOUNDARY SETTINGS
3185  IF (obc_on) THEN
3186  ! NEED SPECIAL VARIABLE FOR GLOBAL NODE NUMBER OF LOCAL NODES...
3187  allocate(i_obc_n_output(iobcn_gl),stat=status)
3188  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:I_OBC_N_OUTPUT")
3189  i_obc_n_output = 0
3190 
3191 
3192  allocate(type_obc(iobcn_gl),stat=status)
3193  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:type_obc")
3194  type_obc = 0
3195  END IF
3196 
3197 ! LONG SHORE FLOW BOUNDARY SETTINGS
3198  IF(obc_longshore_flow_on) THEN
3199  allocate(ibclsf_output(nobclsf_gl),stat=status)
3200  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:IBCLSF_OUTPUT")
3201  ibclsf_output = 0
3202 
3203  allocate(rbc_geo(nobclsf_gl),stat=status)
3204  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:RBC_GEO")
3205  rbc_geo = 0.0_sp
3206 
3207  allocate(rbc_wdf(nobclsf_gl),stat=status)
3208  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:RBC_WDF")
3209  rbc_wdf = 0.0_sp
3210  END IF
3211 
3212 
3213  allocate(tmean1(mgl,kb),stat=status)
3214  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:Tmean1")
3215  tmean1 = 0.0_sp
3216 
3217  allocate(smean1(mgl,kb),stat=status)
3218  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:Smean1")
3219  smean1 = 0.0_sp
3220 
3221 
3222 
3223  ! ------ New: Karsten Lettmann, 2016, June ---------------
3224  ! add the atmospheric pressure elevation
3225  ! -------- end new -------------------------------------
3226 
3227 
3228  END IF
3229 
3230  ! ALLOCATE THE NEW FILE OBJECT
3231  ncf => new_file()
3232 
3233 
3234  ! COR
3235  var => nc_make_avar(name='cor',&
3236  & values=cor, dim1= dim_nele)
3237 
3238  att => nc_make_att(name='long_name',values='Coriolis Parameter')
3239  var => add(var,att)
3240 
3241  att => nc_make_att(name='units',values='s-1')
3242  var => add(var,att)
3243 
3244  att => nc_make_att(name='grid',values='fvcom_grid')
3245  var => add(var,att)
3246 
3247  att => nc_make_att(name='type',values='data')
3248  var => add(var,att)
3249 
3250  ncf => add(ncf,var)
3251 
3252  ! CC_SPONGE
3253  var => nc_make_avar(name='cc_sponge',&
3254  & values=cc_sponge, dim1= dim_nele)
3255 
3256  att => nc_make_att(name='long_name',values='Sponge Layer Parameter')
3257  var => add(var,att)
3258 
3259  att => nc_make_att(name='units',values='nd')
3260  var => add(var,att)
3261 
3262  att => nc_make_att(name='grid',values='fvcom_grid')
3263  var => add(var,att)
3264 
3265  att => nc_make_att(name='type',values='data')
3266  var => add(var,att)
3267 
3268  ncf => add(ncf,var)
3269 
3270  ! et
3271  var => nc_make_avar(name='et',&
3272  & values=et, dim1= dim_node, dim2= dim_time)
3273 
3274  att => nc_make_att(name='long_name',values='Water Surface Elevation At Last Timestep')
3275  var => add(var,att)
3276 
3277  att => nc_make_att(name='units',values='meters')
3278  var => add(var,att)
3279 
3280  att => nc_make_att(name='positive',values='up')
3281  var => add(var,att)
3282 
3283  att => nc_make_att(name='standard_name',values='sea_surface_elevation')
3284  var => add(var,att)
3285 
3286  att => nc_make_att(name='grid',values='SSH_Mesh')
3287  var => add(var,att)
3288 
3289  att => nc_make_att(name='type',values='data')
3290  var => add(var,att)
3291 
3292  ncf => add(ncf,var)
3293 
3294  ! TMEAN1
3295  var => nc_make_avar(name='tmean1',&
3296  & values=tmean1, dim1= dim_node, dim2= dim_siglay )
3297 
3298  att => nc_make_att(name='long_name',values='mean initial temperature')
3299  var => add(var,att)
3300 
3301  att => nc_make_att(name='standard_name',values='sea_water_temperature')
3302  var => add(var,att)
3303 
3304  att => nc_make_att(name='units',values='degrees_C')
3305  var => add(var,att)
3306 
3307  att => nc_make_att(name='grid',values='SigmaLayer_Mesh')
3308  var => add(var,att)
3309 
3310  att => nc_make_att(name='type',values='data')
3311  var => add(var,att)
3312 
3313  ncf => add(ncf,var)
3314 
3315  ! SMEAN1
3316  var => nc_make_avar(name='smean1',&
3317  & values=smean1, dim1= dim_node, dim2= dim_siglay )
3318 
3319  att => nc_make_att(name='long_name',values='mean initial salinity')
3320  var => add(var,att)
3321 
3322  att => nc_make_att(name='standard_name',values='sea_water_temperature')
3323  var => add(var,att)
3324 
3325  att => nc_make_att(name='units',values='1e-3')
3326  var => add(var,att)
3327 
3328  att => nc_make_att(name='grid',values='SigmaLayer_Mesh')
3329  var => add(var,att)
3330 
3331  att => nc_make_att(name='type',values='data')
3332  var => add(var,att)
3333 
3334  ncf => add(ncf,var)
3335 
3336  IF(obc_on)THEN
3337  ! OBC_GRID
3338  var => nc_make_avar(name='obc_nodes',&
3339  & values=i_obc_n_output, dim1= dim_nobc)
3340 
3341  att => nc_make_att(name='long_name',values='Open Boundary Node Number')
3342  var => add(var,att)
3343 
3344  att => nc_make_att(name='grid',values='obc_grid')
3345  var => add(var,att)
3346 
3347  ncf => add(ncf,var)
3348 
3349  ! OBC_TYPE
3350  var => nc_make_avar(name='obc_type',&
3351  & values=type_obc, dim1= dim_nobc)
3352 
3353  att => nc_make_att(name='long_name',values='Open Boundary Type')
3354  var => add(var,att)
3355 
3356  att => nc_make_att(name='grid',values='obc_grid')
3357  var => add(var,att)
3358 
3359  ncf => add(ncf,var)
3360  END IF
3361 
3362  IF(obc_longshore_flow_on)THEN
3363  ! long shore flow grid
3364  var => nc_make_avar(name='lsf_nodes',&
3365  & values=ibclsf_output, dim1= dim_nlsf)
3366 
3367  att => nc_make_att(name='long_name',values='Longshore Flow Node Number')
3368  var => add(var,att)
3369 
3370  att => nc_make_att(name='grid',values='lsf_grid')
3371  var => add(var,att)
3372 
3373  ncf => add(ncf,var)
3374 
3375  !
3376  var => nc_make_avar(name='wdf',&
3377  & values=rbc_wdf, dim1= dim_nlsf)
3378 
3379  att => nc_make_att(name='long_name',values='Wind Driven Flow Adjustment Scaling')
3380  var => add(var,att)
3381 
3382  att => nc_make_att(name='valid_range',values='[0 1]')
3383  var => add(var,att)
3384 
3385  att => nc_make_att(name='grid',values='lsf_grid')
3386  var => add(var,att)
3387 
3388  ncf => add(ncf,var)
3389 
3390  var => nc_make_avar(name='geo',&
3391  & values=rbc_geo, dim1= dim_nlsf)
3392 
3393  att => nc_make_att(name='long_name',values='Thermal Wind Flow Adjustment Scaling')
3394  var => add(var,att)
3395 
3396  att => nc_make_att(name='valid_range',values='[0 1]')
3397  var => add(var,att)
3398 
3399  att => nc_make_att(name='grid',values='lsf_grid')
3400  var => add(var,att)
3401 
3402  ncf => add(ncf,var)
3403  END IF
3404 
3405 
3406 
3407 
3408 
3409  ! ------ New: Karsten Lettmann, 2016, June ---------------
3410  ! add the atmospheric pressure elevation
3411  ! -------- end new -------------------------------------
3412 
3413 
3414  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END RESTART_EXTRAS_FILE_OBJECT"
3415 
3416  END FUNCTION restart_extras_file_object
3417 !=============================================================
3418 !=============================================================
3419  FUNCTION wet_dry_file_object() RESULT(NCF)
3421  IMPLICIT NONE
3422 
3423  INTEGER :: status
3424  LOGICAL, SAVE :: ioproc_allocated = .false.
3425  TYPE(ncfile), POINTER :: ncf
3426  TYPE(ncvar), POINTER :: var
3427  TYPE(ncatt), POINTER :: att
3428 
3429  character(len=100) :: timestamp, temp, netcdf_convention
3430 
3431  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START WET_DRY_FILE_OBJECT"
3432 
3433  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
3434  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
3435  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
3436  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
3437 
3438  ioproc_allocated = .true.
3439 
3440  allocate(iswetn(mgl),stat=status)
3441  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ISWETN")
3442  iswetn = 0
3443 
3444  allocate(iswetc(ngl),stat=status)
3445  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ISWETC")
3446  iswetc = 0
3447 
3448  allocate(iswetnt(mgl),stat=status)
3449  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ISWETNT")
3450  iswetn = 0
3451 
3452  allocate(iswetct(ngl),stat=status)
3453  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ISWETCT")
3454  iswetct = 0
3455 
3456  allocate(iswetce(ngl),stat=status)
3457  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ISWETCE")
3458  iswetce = 0
3459 
3460 
3461  END IF
3462 
3463 
3464  ! ALLOCATE THE NEW FILE OBJECT
3465  ncf => new_file()
3466 
3467 
3468  ! WET NODES
3469  var => nc_make_avar(name='wet_nodes',&
3470  & values=iswetn, dim1= dim_node, dim2= dim_time)
3471 
3472  att => nc_make_att(name='long_name',values='Wet_Nodes')
3473  var => add(var,att)
3474 
3475  att => nc_make_att(name='grid',values='fvcom_grid')
3476  var => add(var,att)
3477 
3478  att => nc_make_att(name='type',values='data')
3479  var => add(var,att)
3480 
3481  att => nc_make_att(name='coordinates',values='time lat lon')
3482  var => add(var,att)
3483 
3484  att => nc_make_att(name='mesh',values='fvcom_mesh')
3485  var => add(var,att)
3486 
3487  att => nc_make_att(name='location',values='node')
3488  var => add(var,att)
3489 
3490  ncf => add(ncf,var)
3491 
3492  ! WET CELLS
3493  var => nc_make_avar(name='wet_cells',&
3494  & values=iswetc, dim1= dim_nele, dim2= dim_time)
3495 
3496  att => nc_make_att(name='long_name',values='Wet_Cells')
3497  var => add(var,att)
3498 
3499  att => nc_make_att(name='grid',values='fvcom_grid')
3500  var => add(var,att)
3501 
3502  att => nc_make_att(name='type',values='data')
3503  var => add(var,att)
3504 
3505  att => nc_make_att(name='coordinates',values='time latc lonc')
3506  var => add(var,att)
3507 
3508  att => nc_make_att(name='mesh',values='fvcom_mesh')
3509  var => add(var,att)
3510 
3511  att => nc_make_att(name='location',values='face')
3512  var => add(var,att)
3513 
3514  ncf => add(ncf,var)
3515 
3516  ! WET NODES AT LAST INT STEP
3517  var => nc_make_avar(name='wet_nodes_prev_int',&
3518  & values=iswetnt, dim1= dim_node, dim2= dim_time)
3519 
3520  att => nc_make_att(name='long_name',values='Wet_Nodes_At_Previous_Internal_Step')
3521  var => add(var,att)
3522 
3523  att => nc_make_att(name='grid',values='fvcom_grid')
3524  var => add(var,att)
3525 
3526  att => nc_make_att(name='type',values='data')
3527  var => add(var,att)
3528 
3529  att => nc_make_att(name='coordinates',values='time lat lon')
3530  var => add(var,att)
3531 
3532  att => nc_make_att(name='mesh',values='fvcom_mesh')
3533  var => add(var,att)
3534 
3535  att => nc_make_att(name='location',values='node')
3536  var => add(var,att)
3537 
3538  ncf => add(ncf,var)
3539 
3540  ! WET CELLS AT LAST EXT STEP
3541  var => nc_make_avar(name='wet_cells_prev_int',&
3542  & values=iswetct, dim1= dim_nele, dim2= dim_time)
3543 
3544  att => nc_make_att(name='long_name',values='Wet_Cells_At_Previous_Internal_Step')
3545  var => add(var,att)
3546 
3547  att => nc_make_att(name='grid',values='fvcom_grid')
3548  var => add(var,att)
3549 
3550  att => nc_make_att(name='type',values='data')
3551  var => add(var,att)
3552 
3553  att => nc_make_att(name='coordinates',values='time latc lonc')
3554  var => add(var,att)
3555 
3556  att => nc_make_att(name='mesh',values='fvcom_mesh')
3557  var => add(var,att)
3558 
3559  att => nc_make_att(name='location',values='face')
3560  var => add(var,att)
3561 
3562  ncf => add(ncf,var)
3563 
3564  ! WET CELLS AT LAST EXT STEP
3565  var => nc_make_avar(name='wet_cells_prev_ext',&
3566  & values=iswetce, dim1= dim_nele, dim2= dim_time)
3567 
3568  att => nc_make_att(name='long_name',values='Wet_Cells_At_Previous_External_Step')
3569  var => add(var,att)
3570 
3571  att => nc_make_att(name='grid',values='fvcom_grid')
3572  var => add(var,att)
3573 
3574  att => nc_make_att(name='type',values='data')
3575  var => add(var,att)
3576 
3577  ncf => add(ncf,var)
3578 
3579 
3580  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END WET_DRY_FILE_OBJECT"
3581 
3582  END FUNCTION wet_dry_file_object
3583 
3584 !=============================================================
3585 !=============================================================
3586  FUNCTION icing_file_object() RESULT(NCF)
3587  IMPLICIT NONE
3588 
3589  INTEGER :: status
3590  LOGICAL, SAVE :: ioproc_allocated = .false.
3591  TYPE(ncfile), POINTER :: ncf
3592  TYPE(ncvar), POINTER :: var
3593  TYPE(ncatt), POINTER :: att
3594 
3595  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START ICING_FILE_OBJECT"
3596 
3597  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
3598  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
3599  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
3600  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
3601 
3602  ioproc_allocated = .true.
3603 
3604  allocate(icing_0kts(mgl),stat=status)
3605  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ICING_0kts")
3606  icing_0kts = 0.0_sp
3607 
3608  allocate(icing_10kts(mgl),stat=status)
3609  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ICING_10kts")
3610  icing_10kts = 0.0_sp
3611 
3612  allocate(icing_wndx(mgl),stat=status)
3613  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ICING_wndY")
3614  icing_wndx = 0.0_sp
3615 
3616  allocate(icing_wndy(mgl),stat=status)
3617  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ICING_wndX")
3618  icing_wndy = 0.0_sp
3619 
3620  allocate(icing_satmp(mgl),stat=status)
3621  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:ICING_satmp")
3622  icing_satmp = 0.0_sp
3623 
3624  END IF
3625 
3626 
3627  ! ALLOCATE THE NEW FILE OBJECT
3628  ncf => new_file()
3629 
3630 
3631  ! ICING_0KTS
3632  var => nc_make_avar(name='icing_0kts',&
3633  & values=icing_0kts, dim1= dim_node, dim2= dim_time)
3634 
3635  att => nc_make_att(name='long_name',values='Icing Hazard@0knots')
3636  var => add(var,att)
3637 
3638  att => nc_make_att(name='units',values='m C s^-1')
3639  var => add(var,att)
3640 
3641  att => nc_make_att(name='grid',values='fvcom_grid')
3642  var => add(var,att)
3643 
3644  att => nc_make_att(name='type',values='data')
3645  var => add(var,att)
3646 
3647  ncf => add(ncf,var)
3648 
3649  ! ICING_10KTS
3650  var => nc_make_avar(name='icing_10kts',&
3651  & values=icing_10kts, dim1= dim_node, dim2= dim_time)
3652 
3653  att => nc_make_att(name='long_name',values='Icing Hazard@10knots')
3654  var => add(var,att)
3655 
3656  att => nc_make_att(name='units',values='m C s^-1')
3657  var => add(var,att)
3658 
3659  att => nc_make_att(name='grid',values='fvcom_grid')
3660  var => add(var,att)
3661 
3662  att => nc_make_att(name='type',values='data')
3663  var => add(var,att)
3664 
3665  ncf => add(ncf,var)
3666 
3667  ! ICING_WNDX
3668  var => nc_make_avar(name='icing_wndx',&
3669  & values=icing_wndx, dim1= dim_node, dim2= dim_time)
3670 
3671  att => nc_make_att(name='long_name',values='Icing Wind x-direction')
3672  var => add(var,att)
3673 
3674  att => nc_make_att(name='units',values='m s^-1')
3675  var => add(var,att)
3676 
3677  att => nc_make_att(name='grid',values='fvcom_grid')
3678  var => add(var,att)
3679 
3680  att => nc_make_att(name='type',values='data')
3681  var => add(var,att)
3682 
3683  ncf => add(ncf,var)
3684 
3685  ! ICING_WNDY
3686  var => nc_make_avar(name='icing_wndy',&
3687  & values=icing_wndy, dim1= dim_node, dim2= dim_time)
3688 
3689  att => nc_make_att(name='long_name',values='Icing Wind y-direction')
3690  var => add(var,att)
3691 
3692  att => nc_make_att(name='units',values='m s^-1')
3693  var => add(var,att)
3694 
3695  att => nc_make_att(name='grid',values='fvcom_grid')
3696  var => add(var,att)
3697 
3698  att => nc_make_att(name='type',values='data')
3699  var => add(var,att)
3700 
3701  ncf => add(ncf,var)
3702 
3703  ! ICING_SATMP
3704  var => nc_make_avar(name='icing_satmp',&
3705  & values=icing_satmp, dim1= dim_node, dim2= dim_time)
3706 
3707  att => nc_make_att(name='long_name',values='Icing Surface Air Temperature')
3708  var => add(var,att)
3709 
3710  att => nc_make_att(name='units',values='degrees_C')
3711  var => add(var,att)
3712 
3713  att => nc_make_att(name='grid',values='fvcom_grid')
3714  var => add(var,att)
3715 
3716  att => nc_make_att(name='type',values='data')
3717  var => add(var,att)
3718 
3719  ncf => add(ncf,var)
3720 
3721 
3722  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END ICING_FILE_OBJECT"
3723 
3724  END FUNCTION icing_file_object
3725 !=============================================================
3726 !=============================================================
3727  FUNCTION groundwater_file_object() RESULT(NCF)
3728  IMPLICIT NONE
3729 
3730  INTEGER :: status
3731  LOGICAL, SAVE :: ioproc_allocated = .false.
3732  TYPE(ncfile), POINTER :: ncf
3733  TYPE(ncvar), POINTER :: var
3734  TYPE(ncatt), POINTER :: att
3735 
3736  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START: GROUNDWATER_FILE_OBJECT"
3737 
3738  ! IO PROC MUST ALLOCATE SPACE FOR THE ARRAYS
3739  ! THESE ARRAYS MUST HAVE THE ATTRIBUTE SAVE AND FOR CLARITY
3740  ! SHOULD HAVE THE SAME NAME AS THOSE USED ON THE OTHER PROCESSORS!
3741  IF(ioproc .AND. .NOT. ioproc_allocated) THEN
3742 
3743  ioproc_allocated = .true.
3744 
3745  allocate(bfwdis(mgl),stat=status)
3746  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:BFWDIS")
3747  bfwdis = 0.0_sp
3748 
3749  IF(groundwater_temp_on) THEN
3750  allocate(bfwtmp(mgl),stat=status)
3751  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:BFWTMP")
3752  bfwtmp = 0.0_sp
3753  END IF
3754 
3755  IF(groundwater_salt_on) THEN
3756  allocate(bfwslt(mgl),stat=status)
3757  IF (status /=0 ) CALL fatal_error("COULD NOT ALLOCATE MEMORY ON IO PROC FOR OUTPUT DATA:BFWSLT")
3758  bfwslt = 0.0_sp
3759  END IF
3760 
3761 
3762  END IF
3763 
3764 
3765  ! ALLOCATE THE NEW FILE OBJECT
3766  ncf => new_file()
3767 
3768 
3769  ! GROUNDWATER VOLUME FLUX
3770  var => nc_make_avar(name='groundwater_flux',&
3771  & values=bfwdis, dim1= dim_node, dim2= dim_time)
3772 
3773  att => nc_make_att(name='long_name',values='groundwater volume flux')
3774  var => add(var,att)
3775 
3776  att => nc_make_att(name='units',values='m3 s-1')
3777  var => add(var,att)
3778 
3779  att => nc_make_att(name='grid',values='fvcom_grid')
3780  var => add(var,att)
3781 
3782  att => nc_make_att(name='type',values='data')
3783  var => add(var,att)
3784 
3785  ncf => add(ncf,var)
3786 
3787  ! GROUNDWATER INFLOW TEMPERATURE
3788  IF(groundwater_temp_on) THEN
3789  var => nc_make_avar(name='groundwater_temp',&
3790  & values=bfwdis, dim1= dim_node, dim2= dim_time)
3791 
3792  att => nc_make_att(name='long_name',values='groundwater inflow temperature')
3793  var => add(var,att)
3794 
3795  att => nc_make_att(name='units',values='degrees_C')
3796  var => add(var,att)
3797 
3798  att => nc_make_att(name='grid',values='fvcom_grid')
3799  var => add(var,att)
3800 
3801  att => nc_make_att(name='type',values='data')
3802  var => add(var,att)
3803 
3804  ncf => add(ncf,var)
3805  END IF
3806 
3807  ! GROUNDWATER INFLOW SALINITY
3808  IF(groundwater_salt_on) THEN
3809  var => nc_make_avar(name='groundwater_salt',&
3810  & values=bfwdis, dim1= dim_node, dim2= dim_time)
3811 
3812  att => nc_make_att(name='long_name',values='groundwater inflow salinity')
3813  var => add(var,att)
3814 
3815  att => nc_make_att(name='units',values='1e-3')
3816  var => add(var,att)
3817 
3818  att => nc_make_att(name='grid',values='fvcom_grid')
3819  var => add(var,att)
3820 
3821  att => nc_make_att(name='type',values='data')
3822  var => add(var,att)
3823 
3824  ncf => add(ncf,var)
3825  END IF
3826 
3827 
3828  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END GROUND_FILE_OBJECT"
3829 
3830  END FUNCTION groundwater_file_object
3831 !=============================================================
3832 
3833 
3834 !!! ggao/0104/2008 !! restart file for ice model
3835 !!---------------------------------------------------------------------------
3836 !!---------------------------------------------------------------------------
3837 !!---------------------------------------------------------------------------
3838 !! ggao/0104/2008 !! restart file for ice model
3839 !=============================================================
3840 !=============================================================
3841 !=============================================================
3842  FUNCTION time_file_object() RESULT(NCF)
3843  IMPLICIT NONE
3844 
3845  INTEGER :: status
3846  TYPE(ncfile), POINTER :: ncf
3847  TYPE(ncvar), POINTER :: var
3848  TYPE(ncatt), POINTER :: att
3849  INTEGER :: ii
3850 
3851  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START TIME_OBJECT"
3852 
3853  ! ALLOCATE THE NEW FILE OBJECT
3854  ncf => new_file()
3855 
3856  ! IINT
3857  var => iint_object(dim=dim_time)
3858 
3859  ncf => add(ncf,var)
3860 
3861  ! time
3862  var => float_time_object &
3863  &(use_mjd=use_real_world_time, &
3864  & dim=dim_time)
3865 
3866  ncf => add(ncf,var)
3867 
3868 
3869  ! Itime
3870  var => itime_object &
3871  &(use_mjd=use_real_world_time, &
3872  & dim=dim_time)
3873 
3874  ncf => add(ncf,var)
3875 
3876  ! Itime2
3877  var => itime2_object &
3878  &(use_mjd=use_real_world_time, &
3879  & dim=dim_time)
3880 
3881  ncf => add(ncf,var)
3882 
3883  IF (use_real_world_time) THEN
3884 
3885  var => datetime_object &
3886  &(dimstr=dim_datestrlen,&
3887  & dimtime=dim_time,&
3888  timezone=timezone)
3889 
3890  ncf => add(ncf,var)
3891  END IF
3892 
3893  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END TIME_OBJECT"
3894 
3895  END FUNCTION time_file_object
3896  !=============================================================
3897 
3898 
3899 
3900 ! J. Ge for fluid mud layer
3901 ! J. Ge for fluid mud layer
3902 
3903 
3904 
3905 !=============================================================
3906 
3907 
3908 !=============================================================
3909 
3910 !=============================================================
3911 
3912 SUBROUTINE update_iodata(NCF,NOW)
3913  IMPLICIT NONE
3914  TYPE(time), INTENT(IN) :: NOW
3915  TYPE(ncvar), POINTER :: VAR1,VAR2
3916  TYPE(ncfile), POINTER :: NCF
3917  LOGICAL :: FOUND
3918 !====================================================================
3919 ! THIS SUBROUTINE IS IN CHARGE OF UPDATING ANY VARIABLES FOR IO WHICH
3920 ! ARE NOT ALREADY UPDATED BY FVCOM DURING THE MAIN LOOP:
3921 !====================================================================
3922  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "START UPDATE_IODATA"
3923 
3924  if(.not. Associated(ncf)) CALL fatal_error&
3925  &("UPDATE_IODATA: THE FILE OBJECT IS NOT ASSOCIATED!")
3926 
3927  var1 => find_var(ncf,"time",found)
3928  IF(found) CALL update_float_time(var1,now)
3929 
3930  var1 => find_var(ncf,"Itime",found)
3931  IF(found) THEN
3932  var2 => find_var(ncf,"Itime2",found)
3933  IF (.NOT.found) THEN
3934  CALL warning&
3935  & ("FOUND ONLY PART OF INTEGER TIME VARIABLE IN OUT PUT FILE!")
3936  ELSE
3937  CALL update_itime(var1,var2,now)
3938  END IF
3939  END IF
3940 
3941  var1 => find_var(ncf,"Times",found)
3942  IF(found) CALL update_datetime(var1,now)
3943 
3944 
3945  ! IINT IS A LONG LONG INTEGER BUT WE CAN'T WRITE LONG INTEGERS...
3946  var1 => find_var(ncf,"iint",found)
3947  IF(found) var1%scl_int = iint
3948 
3949  var1 => find_var(ncf,"file_date",found)
3950  IF(found) CALL update_datetime(var1,get_now())
3951 
3952  IF(dbg_set(dbg_sbr)) WRITE(ipt,*) "END UPDATE_IODATA"
3953 
3954 END SUBROUTINE update_iodata
3955 !=============================================================
3956 !
3957 !-------------------------------------------------------------
3958 !
3959 !=============================================================
3960 ! PROGRAMS FOR THE OUTPUT OF SUBDOMAINS IN FVCOM
3961 !=============================================================
3962 SUBROUTINE setup_subdomains(SUB_FILES,GRIDS)
3963  IMPLICIT NONE
3964  TYPE(ncfile), POINTER :: NCF
3965  TYPE(grid), POINTER :: GRIDS(:)
3966  CHARACTER(LEN=*) :: SUB_FILES
3967  CHARACTER(LEN=80),ALLOCATABLE :: FNAMES(:)
3968  CHARACTER(LEN=80) :: FILE,PATH,EXT
3969  INTEGER :: NUMF,I, STATUS
3970 
3971  INTEGER, POINTER:: NID(:),EID(:)
3972 
3973  if(dbg_set(dbg_sbr)) write(ipt,*) "START Setup_subdomains"
3974 
3975 
3976 
3977  IF(serial .and. sub_files /= "FVCOM") THEN
3978  CALL warning&
3979  &("SETUP_SUBDOMAIN: YOU CAN NOT USE SUBDOMAIN OUTPUT DURING A SINGLE PROCESSOR MODLE RUN!")
3980  sub_files = "FVCOM"
3981  ELSEIF(len_trim(sub_files) == 0 ) THEN
3982  CALL fatal_error("THE SUBDOMAIN FILE LIST PASSED TO SETUP_SUBDOMAINS IS EMPTY",&
3983  &"PLEASE CHECK YOUR NAME LIST FILE FOR THE NC_SUBDOMAIN_FILES",&
3984  &"AND NCAV_SUBDOMAIN_FILES ENTRIES!")
3985 
3986  END IF
3987 
3988 
3989 
3990  CALL split_string(sub_files,",",fnames)
3991  numf =SIZE(fnames)
3992 
3993 
3994  if(dbg_set(dbg_log)) write(ipt,*) "! NUMBER OF DOMAINS TO OUTPUT:",numf
3995  ALLOCATE(grids(numf),stat=status)
3996  IF(status /=0) CALL fatal_error("NCDIO: COULD NOT ALLOCATE SUBDOMAIN GRIDS!")
3997 
3998 
3999  if(dbg_set(dbg_log)) write(ipt,*) "! SETTING FVCOM DOMAIN OUTPUT"
4000  if(dbg_set(dbg_log)) write(ipt,*) "! DIMENSIONS: MGL =",mgl
4001  if(dbg_set(dbg_log)) write(ipt,*) "! DIMENSIONS: NGL =",ngl
4002 
4003  CALL set_fvcom_grid(grids(1))
4004 
4005 
4006 END SUBROUTINE setup_subdomains
4007 
4008 !==============================================================================|
4009 !
4010 ! THIS SUBOURTINE IS USED TO TRANSFER ALL THE DATA IN THE FVCOM GRID
4011  ! TO A LOCAL SUBDOMAIN. IT WILL CORRECTLY TAKE THE VALUES/INDEXS
4012  ! AND SHIFT THEM INTO THE SUBDOMAIN REFERENCE
4013 !
4014 !==============================================================================|
4015  SUBROUTINE set_fvcom_grid(G)
4016  IMPLICIT NONE
4017  TYPE(grid):: G
4018  INTEGER :: I,J,STATUS
4019 
4020  if(dbg_set(dbg_sbr)) &
4021  & write(ipt,*) "START SET_FVCOM_GRID"
4022 
4023  ! SET UP GLOBAL GRID INDEX - USED TO MAKE INDEX ARRAYS FOR OUTPUT
4024  ! TO FILE
4025 
4026  g%NAME = "FVCOM"
4027  g%UNITS = "Not used yet"
4028 
4029  g%MGL = mgl
4030  g%NGL = ngl
4031  g%KB = kb
4032  g%KBM1 = kbm1
4033  g%KBM2 = kbm2
4034 
4035  NULLIFY(g%NV)
4036 
4037  NULLIFY(g%XM)
4038  NULLIFY(g%YM)
4039  NULLIFY(g%XMC)
4040  NULLIFY(g%YMC)
4041 
4042  NULLIFY(g%LAT)
4043  NULLIFY(g%LON)
4044  NULLIFY(g%LATC)
4045  NULLIFY(g%LONC)
4046 
4047  NULLIFY(g%NBE)
4048  NULLIFY(g%NBSN)
4049  NULLIFY(g%NBVE)
4050 
4051  IF(.NOT. ioproc) THEN
4052  g%M = m
4053  g%MT = mt
4054  g%N = n
4055  g%NT = nt
4056 
4057  g%ELID => elid
4058  g%ELID_X => elid_x
4059  g%NLID => nlid
4060  g%NLID_X => nlid_x
4061 
4062  g%EGID => egid
4063  g%EGID_X => egid_x
4064  g%NGID => ngid
4065  g%NGID_X => ngid_x
4066 
4067 
4068 
4069  IF(par) THEN
4070  ! MUST ALLOCATE SPACE AND CREATE GLOBAL INDEX FOR OUTPUT
4071 
4072  ALLOCATE(g%NV(g%NT,3), stat=status)
4073  IF(status /=0) CALL fatal_error("FVCOM2GRID: COULD NOT ALLOCATE G%NV")
4074  g%NV=0
4075  DO i = 1,g%NT
4076  g%NV(i,:) = g%NGID_X(nv(i,1:3))
4077  END DO
4078 
4079 
4080  ALLOCATE(g%NBE(0:n,3), stat=status)
4081  IF(status /=0) CALL fatal_error("FVCOM2GRID: COULD NOT ALLOCATE G%NBE")
4082  g%NBE = 0
4083  DO i = 1,n
4084  g%NBE(i,:) = g%EGID_X(nbe(i,:))
4085  END DO
4086 
4087 
4088  ALLOCATE(g%NBSN(0:m,mx_nbr_elem+3), stat=status)
4089  IF(status /=0) CALL fatal_error("FVCOM2GRID: COULD NOT ALLOCATE G%NBSN")
4090  g%NBSN = 0
4091 
4092  ALLOCATE(g%NBVE(0:m,mx_nbr_elem+1), stat=status)
4093  IF(status /=0) CALL fatal_error("FVCOM2GRID: COULD NOT ALLOCATE G%NBVE")
4094  g%NBVE = 0
4095 
4096  DO i = 1,m
4097  g%NBVE(i,:) = g%EGID_X(nbve(i,:))
4098 
4099  g%NBSN(i,:) = g%NGID_X(nbsn(i,:))
4100  END DO
4101 
4102 
4103  ELSE
4104  ! IF NOT PARALLEL JUST POINT TO FVCOM DATA FOR OUTPUT
4105  g%NV => nv
4106 
4107  g%NBE => nbe
4108  g%NBVE => nbve
4109  g%NBSN => nbsn
4110 
4111  END IF
4112 
4113  END IF
4114 
4115  if(dbg_set(dbg_sbr)) &
4116  & write(ipt,*) "END SET_FVCOM_GRID"
4117 
4118  END SUBROUTINE set_fvcom_grid
4119 
4120 
4121  SUBROUTINE set_subdomain_grid(G)
4123  ! THIS CODE SETS THE VALUES FOR NBE, NV, NBVE, NBSN
4124 
4125  IMPLICIT NONE
4126  TYPE(grid) :: G
4127  LOGICAL :: TEST
4128  INTEGER :: I,J,STATUS
4129  INTEGER, POINTER :: INV_E(:),INV_N(:)
4130 
4131  if(dbg_set(dbg_sbr)) &
4132  & write(ipt,*) "START SET_SUBDOMAIN_GRID"
4133 
4134 
4135  IF(.NOT. ioproc) THEN
4136 
4137  ! CREATE THE INVERSE ARRAY FOR NLID_X
4138  ALLOCATE(inv_n(0:mt));inv_n=0
4139  DO i=1,g%MT
4140  inv_n(g%NLID_X(i))=i
4141  END DO
4142 
4143 
4144  ALLOCATE(inv_e(0:nt));inv_e=0
4145  DO i=1,g%NT
4146  inv_e(g%ELID_X(i))=i
4147  END DO
4148 
4149 
4150  ! MAKE NV - CONNECTIVITY
4151  ALLOCATE(g%NV(g%NT,3), stat=status)
4152  IF(status /=0) CALL fatal_error("SET_SUBDOMAIN_GRID: COULD NOT ALLOCATE G%NV")
4153 
4154  ! CREAT THE GLOBAL INDEXED CONNECTIVITY ARRAY FOR THIS SUBDOMAIN
4155  DO i = 1,g%NT
4156  ! write(ipt,*) "NV(G%ELID_X(I),1:3)", NV(G%ELID_X(I),1:3)
4157  ! write(ipt,*) "INV(NV(G%ELID_X(I),1:3))" ,INV(NV(G%ELID_X(I),1:3))
4158  g%NV(i,:) = g%NGID_X(inv_n(nv(g%ELID_X(i),1:3)))
4159  END DO
4160 
4161 
4162  ! CREATE THE INVERSE ARRAY FOR NLID AND ELID
4163 
4164 
4165  ! MAKE NBE - ELEMENTS SURROUNDING EACH ELEMENT
4166  ALLOCATE(g%NBE(0:g%N,3), stat=status)
4167  IF(status /=0) CALL fatal_error("FVCOM2GRID: COULD NOT ALLOCATE G%NBE")
4168  g%NBE = 0
4169  DO i = 1,g%N
4170  g%NBE(i,:) = g%EGID_X(inv_e(nbe(g%ELID(i),:)))
4171  END DO
4172 
4173 
4174  ! MAKE NBSN AND NBVE
4175  ALLOCATE(g%NBSN(0:g%M,mx_nbr_elem+3), stat=status)
4176  IF(status /=0) CALL fatal_error("FVCOM2GRID: COULD NOT ALLOCATE G%NBSN")
4177  g%NBSN = 0
4178 
4179  ALLOCATE(g%NBVE(0:g%M,mx_nbr_elem+1), stat=status)
4180  IF(status /=0) CALL fatal_error("FVCOM2GRID: COULD NOT ALLOCATE G%NBVE")
4181  g%NBVE = 0
4182 
4183  DO i = 1,g%M
4184  g%NBVE(i,:) = g%EGID_X(inv_e(nbve(g%NLID(i),:)))
4185 
4186  g%NBSN(i,:) = g%NGID_X(inv_n(nbsn(g%NLID(i),:)))
4187  END DO
4188 
4189 
4190  DEALLOCATE(inv_n)
4191  DEALLOCATE(inv_e)
4192 
4193 
4194  END IF
4195 
4196 
4197  if(dbg_set(dbg_sbr)) &
4198  & write(ipt,*) "END SET_SUBDOMAIN_GRID"
4199 
4200  END SUBROUTINE set_subdomain_grid
4201 
4202 !=============================================================
4203 !=============================================================
4204 !=============================================================
4205 !=============================================================
4206  SUBROUTINE setup_mpi_io_mode(TF,COMMGRP)
4207  !===================================================================================|
4208  ! INITIALIZE MPI ENVIRONMENT |
4209  !===================================================================================|
4210  LOGICAL, INTENT(INOUT) :: TF
4211  INTEGER, INTENT(OUT) :: COMMGRP
4212  INTEGER :: total_group
4213  INTEGER :: fvcom_group
4214  INTEGER :: SBUF,RBUF, trueval, i
4215  INTEGER, allocatable :: fvcom_subset(:)
4216  INTEGER IERR
4217 
4218 
4219  if(dbg_set(dbg_sbr)) &
4220  & write(ipt,*) "STARTING SETUP_MPI_IO_MODE"
4221 
4222 
4223  if (nprocs .LE. 3) THEN
4224  if (tf) &
4225  & CALL warning("FVCOM CAN NOT USE MPI IO MODE WHEN RUN &
4226  &ON LESS THAN 4 PROCESSORS", "CONTINUING WITHOUT THIS OPTION!")
4227  tf = .false.
4228  end if
4229 
4230  IF (tf) THEN
4231 
4232 
4233  ELSE
4234 
4235  ! MUST SET INTENT(OUT) COMMGRP
4236  ! IF NOT MULTIPROCESSOR SET A DUMMY VALUE
4237  commgrp = -999
4238 
4239 
4240 
4241  IF (dbg_set(dbg_log)) &
4242  & write(ipt,*) "! MPI IO MODE IS NOT ACTIVE"
4243 
4244  END IF
4245 
4246  if(dbg_set(dbg_sbr)) &
4247  & write(ipt,*) "END SETUP_MPI_IO_MODE"
4248  END SUBROUTINE setup_mpi_io_mode
4249 
4250 
4251  SUBROUTINE mpi_io_synchronize(CODE)
4252  implicit none
4253  integer code
4254 
4255  CALL fatal_error("THIS IS A DUMMY ROUTINE:","MPI_IO_SYNCHRONIZ&
4256  &E only exists when FVCOM is compiled with multiprocessor",&
4257  & "USE_MPI_IO_MODE should not be .true.")
4258  END SUBROUTINE mpi_io_synchronize
4259 
4260 
4261 
4262 
4263 END MODULE mod_ncdio
integer, dimension(:), allocatable, target ntsn
Definition: mod_main.f90:1023
subroutine define_dimensions(G)
Definition: mod_ncdio.f90:1098
real(sp), dimension(:,:), allocatable, target q2
Definition: mod_main.f90:1290
real(sp), dimension(:), allocatable, target partition
Definition: mod_main.f90:1277
subroutine update_itime(VAR1, VAR2, NOW)
real(sp), dimension(:,:), allocatable, target km
Definition: mod_main.f90:1293
real(sp), dimension(:), allocatable, target va
Definition: mod_main.f90:1104
subroutine archive
Definition: mod_ncdio.f90:153
real(sp), dimension(:), allocatable, target cor
Definition: mod_main.f90:1113
type(ncvar) function, pointer float_time_object(use_mjd, DIM, size)
real(sp), dimension(:), allocatable, target qprec
Definition: mod_main.f90:1239
integer, dimension(:), allocatable iswetce
Definition: mod_wd.f90:55
type(ncdim), pointer dim_nobc
Definition: mod_ncdio.f90:126
subroutine get_timestamp(TS)
Definition: mod_clock.f90:322
real(sp), dimension(:), allocatable, target h
Definition: mod_main.f90:1131
character(len=char_max_attlen), dimension(:), allocatable, public precip_forcing_comments
Definition: mod_force.f90:222
subroutine set_subdomain_grid(G)
Definition: mod_ncdio.f90:4122
real(sp), dimension(:,:), allocatable, target viscofh
Definition: mod_main.f90:1359
type(ncdim), pointer dim_grid
Definition: mod_ncdio.f90:132
subroutine mpi_io_synchronize(CODE)
Definition: mod_ncdio.f90:4252
type(ncfile) function, pointer wet_dry_file_object()
Definition: mod_ncdio.f90:3420
real(sp), dimension(:), allocatable, target el
Definition: mod_main.f90:1134
real(sp), dimension(:,:), allocatable, target v
Definition: mod_main.f90:1269
logical ncnest_cmd_dump
Definition: mod_ncdio.f90:106
integer, dimension(:), allocatable type_obc
Definition: mod_main.f90:1783
logical function dbg_set(vrb)
Definition: mod_utils.f90:182
real(sp), dimension(:,:), allocatable, target rho1
Definition: mod_main.f90:1309
subroutine update_iodata(NCF, NOW)
Definition: mod_ncdio.f90:3913
real(sp), dimension(:), allocatable, target wtsurf_watts
Definition: mod_main.f90:1174
subroutine dump_nc_rst
Definition: mod_ncdio.f90:365
real(sp), dimension(:), allocatable, target art1
Definition: mod_main.f90:1010
real(sp), dimension(:,:), allocatable, target t1
Definition: mod_main.f90:1307
logical visit_cmd_dump
Definition: mod_ncdio.f90:105
type(ncvar) function, pointer itime_object(use_mjd, DIM, size)
real(sp), dimension(:), allocatable, target ymc
Definition: mod_main.f90:994
type(time) function get_now()
Definition: mod_time.f90:716
subroutine zero_average
Definition: mod_ncdio.f90:920
type(ncfile) function, pointer time_file_object()
Definition: mod_ncdio.f90:3843
real(sp), dimension(:), allocatable, target latc
Definition: mod_main.f90:998
real(sp), dimension(:), allocatable, target icing_0kts
Definition: mod_main.f90:1208
subroutine set_fvcom_grid(G)
Definition: mod_ncdio.f90:4016
real(sp), dimension(:,:), allocatable, target a1u
Definition: mod_main.f90:1331
type(ncfile), pointer nc_avg_sum
Definition: mod_ncdio.f90:139
subroutine dump_data(NCF)
Definition: mod_ncdio.f90:1050
integer, dimension(:), allocatable iswetct
Definition: mod_wd.f90:54
real(sp), dimension(:,:), allocatable, target awx
Definition: mod_main.f90:1333
real(sp), dimension(:,:), allocatable, target ww
Definition: mod_main.f90:1280
real(sp), dimension(:), allocatable, target wusurf_save
Definition: mod_main.f90:1193
real(sp), dimension(:,:), allocatable, target q2l
Definition: mod_main.f90:1292
real(sp), dimension(:), allocatable, target art2
Definition: mod_main.f90:1011
type(ncdim) function, pointer nc_make_dim(NAME, LEN)
type(ncfile) function, pointer grid_metrics_file_object(G)
Definition: mod_ncdio.f90:1734
real(sp), dimension(:,:), allocatable, target viscofm
Definition: mod_main.f90:1360
real(sp), dimension(:,:), allocatable, target tmean1
Definition: mod_main.f90:1318
subroutine setup_rstfile
Definition: mod_ncdio.f90:963
real(sp), dimension(:,:), allocatable, target u
Definition: mod_main.f90:1268
real(sp), dimension(:,:), allocatable, target s1
Definition: mod_main.f90:1308
subroutine incriment_fname(FNAME)
Definition: mod_input.f90:988
subroutine setup_datfile
Definition: mod_ncdio.f90:370
real(sp), dimension(:,:), allocatable, target aw0
Definition: mod_main.f90:1335
integer ncav_code
Definition: mod_utils.f90:54
real(sp), dimension(:), allocatable, target icing_wndy
Definition: mod_main.f90:1206
type(ncfile) function, pointer salt_temp_file_object()
Definition: mod_ncdio.f90:2349
real(sp), dimension(:,:), allocatable, target smean1
Definition: mod_main.f90:1319
real(sp), dimension(:), allocatable, target et
Definition: mod_main.f90:1135
real(sp), dimension(:,:), allocatable, target awy
Definition: mod_main.f90:1334
type(ncfile) function, pointer groundwater_file_object()
Definition: mod_ncdio.f90:3728
real(sp), dimension(:), allocatable, target vort
Definition: mod_main.f90:1165
type(ncfile) function, pointer restart_extras_file_object()
Definition: mod_ncdio.f90:3151
character(len=char_max_attlen), dimension(:), allocatable, public gwater_forcing_comments
Definition: mod_force.f90:121
real(sp), dimension(:), allocatable, target bfwslt
Definition: mod_main.f90:1201
type(ncfile) function, pointer wind_velocity_file_object()
Definition: mod_ncdio.f90:2871
subroutine dump_nc_dat
Definition: mod_ncdio.f90:320
subroutine icing(NOW)
Definition: icing.f90:41
type(ncdim), pointer dim_maxnode
Definition: mod_ncdio.f90:129
type(ncfile) function, pointer velocity_file_object()
Definition: mod_ncdio.f90:2003
type(ncdim), pointer dim_node
Definition: mod_ncdio.f90:115
integer, parameter sp
Definition: mod_prec.f90:48
type(ncfile) function, pointer file_date_object(SIZE)
Definition: mod_ncdio.f90:1961
integer, dimension(:), allocatable, target ntve
Definition: mod_main.f90:1022
integer nc_code
Definition: mod_utils.f90:53
real(sp), dimension(:), allocatable, target xmc
Definition: mod_main.f90:993
integer, dimension(:,:), allocatable, target nbe
Definition: mod_main.f90:1020
real(sp), dimension(:), allocatable, target lonc
Definition: mod_main.f90:997
type(ncdim), pointer dim_siglev
Definition: mod_ncdio.f90:120
type(ncdim), pointer dim_nele
Definition: mod_ncdio.f90:114
real(sp), dimension(:), allocatable, target bfwdis
Definition: mod_main.f90:1196
integer, parameter dbg_sbrio
Definition: mod_utils.f90:70
subroutine warning(ER1, ER2, ER3, ER4)
Definition: mod_utils.f90:251
integer, dimension(:), allocatable i_obc_n_output
Definition: mod_main.f90:1781
character(len=char_max_attlen), dimension(:), allocatable, public heat_forcing_comments
Definition: mod_force.f90:159
real(sp), dimension(:), allocatable, target bfwtmp
Definition: mod_main.f90:1200
type(ncvar) function, pointer itime2_object(use_mjd, DIM, size)
integer, dimension(:,:), allocatable, target nv
Definition: mod_main.f90:1018
type(ncfile) function, pointer zeta_file_object()
Definition: mod_ncdio.f90:1666
type(ncdim), pointer dim_ncat
Definition: mod_ncdio.f90:133
character(len=char_max_attlen), dimension(:), allocatable, public icing_forcing_comments
Definition: mod_force.f90:272
integer, dimension(:), allocatable, target ibclsf_output
Definition: mod_main.f90:1081
type(ncfile) function, pointer density_file_object()
Definition: mod_ncdio.f90:2453
real(sp), dimension(:), allocatable, target icing_10kts
Definition: mod_main.f90:1209
subroutine update_float_time(VAR, NOW)
type(ncdim) function, pointer nc_make_runtime_dim(NAME, LEN)
subroutine setup_mpi_io_mode(TF, COMMGRP)
Definition: mod_ncdio.f90:4207
real(sp), dimension(:), allocatable, target xm
Definition: mod_main.f90:991
type(ncfile), pointer nc_avg_data
Definition: mod_ncdio.f90:138
real(sp), dimension(:,:), allocatable, target zz1
Definition: mod_main.f90:1095
character(len=char_max_attlen), dimension(:), allocatable, public tide_forcing_comments
Definition: mod_force.f90:83
real(sp), dimension(:), allocatable, target ua
Definition: mod_main.f90:1103
type(grid), dimension(:), pointer nc_dat_grids
Definition: mod_ncdio.f90:143
subroutine setup_subdomains(SUB_FILES, GRIDS)
Definition: mod_ncdio.f90:3963
real(sp), dimension(:), allocatable, target qevap
Definition: mod_main.f90:1240
subroutine divide_average
Definition: mod_ncdio.f90:877
character(len=char_max_attlen), dimension(:), allocatable, public winds_forcing_comments
Definition: mod_force.f90:181
real(sp), dimension(:,:), allocatable, target l
Definition: mod_main.f90:1291
integer, dimension(:), allocatable iswetnt
Definition: mod_wd.f90:53
real(sp), dimension(:,:), allocatable, target kh
Definition: mod_main.f90:1294
subroutine kill_dimensions
Definition: mod_ncdio.f90:1148
real(sp), dimension(:), allocatable, target swrad_watts
Definition: mod_main.f90:1173
type(ncdim), pointer dim_time
Definition: mod_ncdio.f90:123
real(dp) function seconds(MJD)
Definition: mod_time.f90:742
type(ncfile), pointer nc_avg
Definition: mod_input.f90:49
subroutine split_string(instring, delim, outstrings)
Definition: mod_utils.f90:2050
subroutine init_ncdio
Definition: mod_ncdio.f90:264
real(sp), dimension(:,:), allocatable, target a2u
Definition: mod_main.f90:1332
integer, dimension(:), allocatable iswetc
Definition: mod_wd.f90:52
real(sp), dimension(:), allocatable, target lat
Definition: mod_main.f90:996
integer, dimension(:,:), allocatable, target nbve
Definition: mod_main.f90:1034
real(sp), dimension(:,:), allocatable, target z
Definition: mod_main.f90:1090
subroutine dump_nc_avg
Definition: mod_ncdio.f90:344
subroutine setup_avgfile
Definition: mod_ncdio.f90:567
real(sp), dimension(:), allocatable, target icing_satmp
Definition: mod_main.f90:1207
type(ncdim), pointer dim_nlsf
Definition: mod_ncdio.f90:127
type(ncdim), pointer dim_siglay
Definition: mod_ncdio.f90:119
subroutine fatal_error(ER1, ER2, ER3, ER4)
Definition: mod_utils.f90:230
real(sp), dimension(:), allocatable, target h1
Definition: mod_main.f90:1115
real(sp), dimension(:), allocatable, target lon
Definition: mod_main.f90:995
type(ncfile) function, pointer surface_heating_file_object()
Definition: mod_ncdio.f90:2776
real(sp), dimension(:), allocatable, target vvwind
Definition: mod_main.f90:1233
type(ncvar) function, pointer datetime_object(DIMSTR, DIMTIME, timezone, size)
real(sp), dimension(:), allocatable, target taubm
Definition: mod_main.f90:1187
character(len=char_max_attlen), dimension(:), allocatable, public ice_forcing_comments
Definition: mod_force.f90:254
type(ncdim), pointer dim_four
Definition: mod_ncdio.f90:117
real(sp), dimension(:,:), allocatable, target z1
Definition: mod_main.f90:1094
type(ncfile) function, pointer turbulence_file_object()
Definition: mod_ncdio.f90:2539
type(grid), dimension(:), pointer nc_avg_grids
Definition: mod_ncdio.f90:145
real(sp), dimension(:), allocatable, target wvsurf_save
Definition: mod_main.f90:1194
integer restart_code
Definition: mod_utils.f90:52
type(ncfilelist), pointer, save filehead
real(sp), dimension(:), allocatable, target cc_sponge
Definition: mod_main.f90:1127
integer iobcn_gl
Definition: mod_main.f90:1775
character(len=char_max_attlen), dimension(:), allocatable, public river_forcing_comments
Definition: mod_force.f90:88
integer init_code
Definition: mod_utils.f90:55
subroutine nc_write_file(NCF, LOCAL_ONLY, STKCNT, STKRNG)
real(sp), dimension(:), allocatable, target rbc_geo
Definition: mod_main.f90:1083
integer, dimension(:,:), allocatable, target nbsn
Definition: mod_main.f90:1030
integer, parameter dbg_io
Definition: mod_utils.f90:66
subroutine add_average
Definition: mod_ncdio.f90:824
real(sp), dimension(:,:), allocatable, target wts
Definition: mod_main.f90:1321
real(sp), dimension(:), allocatable, target rbc_wdf
Definition: mod_main.f90:1084
type(ncfile) function, pointer vertical_vel_file_object()
Definition: mod_ncdio.f90:2272
integer, parameter dbg_sbr
Definition: mod_utils.f90:69
type(ncfile) function, pointer grid_file_object(G)
Definition: mod_ncdio.f90:1175
type(ncfile) function, pointer vorticity_file_object()
Definition: mod_ncdio.f90:2141
subroutine update_datetime(VAR, NOW)
type(ncdim), pointer dim_maxelem
Definition: mod_ncdio.f90:130
type(ncvar) function, pointer iint_object(DIM, size)
type(ncdim), pointer dim_datestrlen
Definition: mod_ncdio.f90:124
type(ncfile) function, pointer icing_file_object()
Definition: mod_ncdio.f90:3587
type(ncdim), pointer dim_ntilay
Definition: mod_ncdio.f90:134
type(ncfile), pointer nc_rst
Definition: mod_input.f90:50
type(ncdim), pointer dim_three
Definition: mod_ncdio.f90:116
real(sp), dimension(:,:), allocatable, target zz
Definition: mod_main.f90:1091
type(ncfile), pointer nc_dat
Definition: mod_input.f90:48
real(sp), dimension(:,:), allocatable, target kq
Definition: mod_main.f90:1295
type(ncfile) function, pointer precipitation_file_object()
Definition: mod_ncdio.f90:3055
real(sp), dimension(:), allocatable, target uuwind
Definition: mod_main.f90:1232
character(len=50) coordvar
Definition: mod_ncdio.f90:109
real(sp), dimension(:,:), allocatable, target rmean1
Definition: mod_main.f90:1320
type(ncfile) function, pointer average_vel_file_object()
Definition: mod_ncdio.f90:2194
integer, parameter dbg_log
Definition: mod_utils.f90:65
real(sp), dimension(:), allocatable, target ym
Definition: mod_main.f90:992
real(sp), dimension(:), allocatable, target icing_wndx
Definition: mod_main.f90:1205
integer, dimension(:), allocatable iswetn
Definition: mod_wd.f90:51
type(ncfile) function, pointer wind_stress_file_object()
Definition: mod_ncdio.f90:2972