34 integer(I4B) :: nmesh_node
35 integer(I4B) :: nmesh_face
36 integer(I4B) :: max_nmesh_face_nodes
45 integer(I4B) :: mesh_node_x
46 integer(I4B) :: mesh_node_y
47 integer(I4B) :: mesh_face_x
48 integer(I4B) :: mesh_face_y
49 integer(I4B) :: mesh_face_xbnds
50 integer(I4B) :: mesh_face_ybnds
51 integer(I4B) :: mesh_face_nodes
53 integer(I4B),
dimension(:),
allocatable :: export
54 integer(I4B),
dimension(:),
allocatable :: dependent
64 integer(I4B),
pointer :: chunk_face
85 character(len=*),
intent(in) :: pkgtype
86 character(len=*),
intent(in) :: pkgname
87 character(len=*),
intent(in) :: mempath
101 subroutine mesh_init(this, modelname, modeltype, modelfname, nc_fname, &
102 disenum, nctype, lenuni, iout)
105 character(len=*),
intent(in) :: modelname
106 character(len=*),
intent(in) :: modeltype
107 character(len=*),
intent(in) :: modelfname
108 character(len=*),
intent(in) :: nc_fname
109 integer(I4B),
intent(in) :: disenum
110 integer(I4B),
intent(in) :: nctype
111 integer(I4B),
intent(in) :: lenuni
112 integer(I4B),
intent(in) :: iout
113 logical(LGP) :: found
116 call this%NCModelExportType%init(modelname, modeltype, modelfname, nc_fname, &
117 disenum, nctype, iout)
120 allocate (this%chunk_face)
124 if (this%ncf_mempath /=
'')
then
125 call mem_set_value(this%chunk_face,
'CHUNK_FACE', this%ncf_mempath, found)
128 if (this%chunk_time > 0 .and. this%chunk_face > 0)
then
129 this%chunking_active = .true.
130 else if (this%chunk_time > 0 .or. this%chunk_face > 0)
then
133 write (
warnmsg,
'(a)')
'Ignoring user provided NetCDF chunking parameter. &
134 &Define chunk_time and chunk_face input parameters to see an effect in &
135 &file "'//trim(nc_fname)//
'".'
139 if (lenuni == 1)
then
146 call nf_verify(nf90_create(this%nc_fname, &
147 ior(nf90_clobber, nf90_netcdf4), this%ncid), &
156 call nf_verify(nf90_close(this%ncid), this%nc_fname)
157 deallocate (this%chunk_face)
158 nullify (this%chunk_face)
168 do idx = 1, this%pkglist%Count()
169 export_pkg => this%get(idx)
170 call this%export_df(export_pkg)
182 integer(I4B) :: iparam, iaux, layer
185 do iparam = 1, export_pkg%nparam
192 export_pkg%mf6_input%component_type, &
193 export_pkg%mf6_input%subcomponent_type, &
194 'PERIOD', export_pkg%param_names(iparam),
'')
196 select case (idt%shape)
198 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
200 do layer = 1, this%nlay
201 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
204 do iaux = 1, export_pkg%naux
205 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
208 do iaux = 1, export_pkg%naux
209 do layer = 1, this%nlay
210 call this%create_timeseries(idt, iparam, iaux, layer, export_pkg)
225 integer(I4B),
intent(in) :: iparam
226 integer(I4B),
intent(in) :: iaux
227 integer(I4B),
intent(in) :: layer
229 character(len=LINELENGTH) :: varname, longname, nc_tag
230 integer(I4B) :: varid
233 nc_tag = this%input_attribute(export_pkg%mf6_input%subcomponent_name, &
237 varname = export_varname(export_pkg%mf6_input%subcomponent_name, &
238 idt%tagname, export_pkg%mf6_input%mempath, &
239 layer=layer, iaux=iaux)
240 longname = export_longname(idt%longname, &
241 export_pkg%mf6_input%subcomponent_name, &
242 idt%tagname, export_pkg%mf6_input%mempath, &
243 layer=layer, iaux=iaux)
246 select case (idt%datatype)
247 case (
'DOUBLE1D',
'DOUBLE2D')
248 call nf_verify(nf90_def_var(this%ncid, varname, nf90_double, &
249 (/this%dim_ids%nmesh_face, &
250 this%dim_ids%time/), &
253 call nf_verify(nf90_put_att(this%ncid, varid, &
257 call nf_verify(nf90_def_var(this%ncid, varname, nf90_int, &
258 (/this%dim_ids%nmesh_face, &
259 this%dim_ids%time/), &
262 call nf_verify(nf90_put_att(this%ncid, varid, &
263 '_FillValue', (/nf90_fill_int/)), &
268 if (this%chunking_active)
then
269 call nf_verify(nf90_def_var_chunking(this%ncid, &
273 this%chunk_time/)), &
279 this%shuffle, this%nc_fname)
282 call nf_verify(nf90_put_att(this%ncid, varid, &
283 'units', this%lenunits), this%nc_fname)
284 call nf_verify(nf90_put_att(this%ncid, varid, &
285 'long_name', longname), this%nc_fname)
286 call nf_verify(nf90_put_att(this%ncid, varid, &
287 'mesh', this%mesh_name), this%nc_fname)
288 call nf_verify(nf90_put_att(this%ncid, varid, &
289 'location',
'face'), this%nc_fname)
293 this%gridmap_name, this%nc_fname)
294 call ncvar_mf6attr(this%ncid, varid, layer, iaux, nc_tag, this%nc_fname)
297 if (idt%tagname ==
'AUX')
then
299 export_pkg%varids_aux(iaux, layer) = varid
301 export_pkg%varids_aux(iaux, 1) = varid
305 export_pkg%varids_param(iparam, layer) = varid
307 export_pkg%varids_param(iparam, 1) = varid
317 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'title', &
318 this%annotation%title), this%nc_fname)
320 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'source', &
321 this%annotation%source), this%nc_fname)
323 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow_grid', &
324 this%annotation%grid), this%nc_fname)
326 if (this%annotation%mesh /=
'')
then
327 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'mesh', &
328 this%annotation%mesh), this%nc_fname)
332 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow_model', &
333 this%annotation%model), this%nc_fname)
335 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'history', &
336 this%annotation%history), this%nc_fname)
338 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'Conventions', &
339 this%annotation%conventions), &
348 character(len=*),
intent(in) :: pkgtype
349 character(len=*),
intent(in) :: pkgname
350 character(len=*),
intent(in) :: mempath
352 intent(in) :: param_dfns
354 integer(I4B) :: iparam, isize
356 do iparam = 1,
size(param_dfns)
358 idt => param_dfns(iparam)
360 if (idt%blockname ==
'GRIDDATA')
then
362 call get_isize(idt%mf6varname, mempath, isize)
364 call this%export_input_array(pkgtype, pkgname, mempath, idt)
380 character(LENCOMPONENTNAME) :: ptype, pname, pkgtype
381 character(len=LENMEMPATH) :: input_mempath
383 pointer :: pkgtypes => null()
385 pointer :: pkgnames => null()
387 pointer :: mempaths => null()
389 character(len=LENMEMPATH) :: mempath
391 integer(I4B),
pointer :: export_arrays
392 logical(LGP) :: found
397 call mem_setptr(pkgtypes,
'PKGTYPES', input_mempath)
398 call mem_setptr(pkgnames,
'PKGNAMES', input_mempath)
399 call mem_setptr(mempaths,
'MEMPATHS', input_mempath)
401 allocate (export_arrays)
403 do n = 1,
size(mempaths)
408 mempath = mempaths(n)
413 if (mempath /=
'')
then
415 call mem_set_value(export_arrays,
'EXPORT_NC', mempath, found)
416 if (export_arrays > 0)
then
418 param_dfns => param_definitions(this%modeltype, pkgtype)
419 call this%export_input_arrays(ptype, pname, mempath, param_dfns)
425 deallocate (export_arrays)
432 character(len=LINELENGTH) :: varname, longname
442 write (varname,
'(a,i0)') trim(this%xname)//
'_l', k
443 write (longname,
'(a,i0,a)') trim(this%annotation%longname)// &
447 call nf_verify(nf90_def_var(this%ncid, varname, nf90_double, &
448 (/this%dim_ids%nmesh_face, &
449 this%dim_ids%time/), &
450 this%var_ids%dependent(k)), &
454 if (this%chunking_active)
then
455 call nf_verify(nf90_def_var_chunking(this%ncid, &
456 this%var_ids%dependent(k), &
459 this%chunk_time/)), &
464 call ncvar_deflate(this%ncid, this%var_ids%dependent(k), this%deflate, &
465 this%shuffle, this%nc_fname)
468 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
469 'units', this%lenunits), this%nc_fname)
470 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
471 'standard_name', this%annotation%stdname), &
473 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
474 'long_name', longname), this%nc_fname)
475 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
478 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
479 'mesh', this%mesh_name), this%nc_fname)
480 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
481 'location',
'face'), this%nc_fname)
485 this%gridmap_name, this%nc_fname)
493 integer(I4B) :: var_id
496 if (this%wkt /=
'')
then
498 call nf_verify(nf90_redef(this%ncid), this%nc_fname)
499 call nf_verify(nf90_def_var(this%ncid, this%gridmap_name, nf90_int, &
500 var_id), this%nc_fname)
505 call nf_verify(nf90_put_att(this%ncid, var_id,
'wkt', this%wkt), &
507 call nf_verify(nf90_enddef(this%ncid), this%nc_fname)
508 call nf_verify(nf90_put_var(this%ncid, var_id, 1), &
519 call nf_verify(nf90_def_var(this%ncid, this%mesh_name, nf90_int, &
520 this%var_ids%mesh), this%nc_fname)
523 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'cf_role', &
524 'mesh_topology'), this%nc_fname)
525 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'long_name', &
526 '2D mesh topology'), this%nc_fname)
527 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
528 'topology_dimension', 2), this%nc_fname)
529 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'face_dimension', &
530 'nmesh_face'), this%nc_fname)
531 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
532 'node_coordinates',
'mesh_node_x mesh_node_y'), &
534 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
535 'face_coordinates',
'mesh_face_x mesh_face_y'), &
537 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
538 'face_node_connectivity',
'mesh_face_nodes'), &
542 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_x', nf90_double, &
543 (/this%dim_ids%nmesh_node/), &
544 this%var_ids%mesh_node_x), this%nc_fname)
547 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
548 'units', this%lenunits), this%nc_fname)
549 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
550 'standard_name',
'projection_x_coordinate'), &
552 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
553 'long_name',
'Easting'), this%nc_fname)
555 if (this%wkt /=
'')
then
557 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
558 'grid_mapping', this%gridmap_name), &
563 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_y', nf90_double, &
564 (/this%dim_ids%nmesh_node/), &
565 this%var_ids%mesh_node_y), this%nc_fname)
568 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
569 'units', this%lenunits), this%nc_fname)
570 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
571 'standard_name',
'projection_y_coordinate'), &
573 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
574 'long_name',
'Northing'), this%nc_fname)
576 if (this%wkt /=
'')
then
578 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
579 'grid_mapping', this%gridmap_name), &
584 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_x', nf90_double, &
585 (/this%dim_ids%nmesh_face/), &
586 this%var_ids%mesh_face_x), this%nc_fname)
589 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
590 'units', this%lenunits), this%nc_fname)
591 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
592 'standard_name',
'projection_x_coordinate'), &
594 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
595 'long_name',
'Easting'), this%nc_fname)
596 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x,
'bounds', &
597 'mesh_face_xbnds'), this%nc_fname)
598 if (this%wkt /=
'')
then
600 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
601 'grid_mapping', this%gridmap_name), &
606 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_xbnds', nf90_double, &
607 (/this%dim_ids%max_nmesh_face_nodes, &
608 this%dim_ids%nmesh_face/), &
609 this%var_ids%mesh_face_xbnds), &
613 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_y', nf90_double, &
614 (/this%dim_ids%nmesh_face/), &
615 this%var_ids%mesh_face_y), this%nc_fname)
618 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
619 'units', this%lenunits), this%nc_fname)
620 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
621 'standard_name',
'projection_y_coordinate'), &
623 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
624 'long_name',
'Northing'), this%nc_fname)
625 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y,
'bounds', &
626 'mesh_face_ybnds'), this%nc_fname)
628 if (this%wkt /=
'')
then
630 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
631 'grid_mapping', this%gridmap_name), &
636 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_ybnds', nf90_double, &
637 (/this%dim_ids%max_nmesh_face_nodes, &
638 this%dim_ids%nmesh_face/), &
639 this%var_ids%mesh_face_ybnds), &
643 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_nodes', nf90_int, &
644 (/this%dim_ids%max_nmesh_face_nodes, &
645 this%dim_ids%nmesh_face/), &
646 this%var_ids%mesh_face_nodes), &
650 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
651 'cf_role',
'face_node_connectivity'), &
653 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
655 'Vertices bounding cell (counterclockwise)'), &
657 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
658 '_FillValue', (/nf90_fill_int/)), &
660 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
661 'start_index', 1), this%nc_fname)
667 integer(I4B),
intent(in) :: ncid
668 integer(I4B),
intent(in) :: varid
669 integer(I4B),
intent(in) :: chunk_face
670 character(len=*),
intent(in) :: nc_fname
671 if (chunk_face > 0)
then
672 call nf_verify(nf90_def_var_chunking(ncid, varid, nf90_chunked, &
673 (/chunk_face/)), nc_fname)
680 integer(I4B),
intent(in) :: ncid
681 integer(I4B),
intent(in) :: varid
682 integer(I4B),
intent(in) :: deflate
683 integer(I4B),
intent(in) :: shuffle
684 character(len=*),
intent(in) :: nc_fname
685 if (deflate >= 0)
then
686 call nf_verify(nf90_def_var_deflate(ncid, varid, shuffle=shuffle, &
687 deflate=1, deflate_level=deflate), &
695 integer(I4B),
intent(in) :: ncid
696 integer(I4B),
intent(in) :: varid
697 character(len=*),
intent(in) :: gridmap_name
698 character(len=*),
intent(in) :: nc_fname
699 if (gridmap_name /=
'')
then
700 call nf_verify(nf90_put_att(ncid, varid,
'coordinates', &
701 'mesh_face_x mesh_face_y'), nc_fname)
702 call nf_verify(nf90_put_att(ncid, varid,
'grid_mapping', &
703 gridmap_name), nc_fname)
710 integer(I4B),
intent(in) :: ncid
711 integer(I4B),
intent(in) :: varid
712 integer(I4B),
intent(in) :: layer
713 integer(I4B),
intent(in) :: iaux
714 character(len=*),
intent(in) :: nc_tag
715 character(len=*),
intent(in) :: nc_fname
716 if (nc_tag /=
'')
then
717 call nf_verify(nf90_put_att(ncid, varid,
'modflow_input', &
720 call nf_verify(nf90_put_att(ncid, varid,
'layer', &
724 call nf_verify(nf90_put_att(ncid, varid,
'modflow_iaux', &
abstract interfaces for derived ugrid netcd export types
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
integer(i4b), parameter lencomponentname
maximum length of a component name
real(dp), parameter dnodata
real no data constant
real(dp), parameter dhnoflo
real no flow constant
integer(i4b), parameter lenmempath
maximum length of the memory path
This module contains the DefinitionSelectModule.
type(inputparamdefinitiontype) function, pointer, public get_param_definition_type(input_definition_types, component_type, subcomponent_type, blockname, tagname, filename)
Return parameter definition.
type(inputparamdefinitiontype) function, dimension(:), pointer, public param_definitions(component, subcomponent)
logical function, public idm_multi_package(component, subcomponent)
This module defines variable data types.
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
subroutine, public get_isize(name, mem_path, isize)
@ brief Get the number of elements for this variable
This module contains the MeshModelModule.
subroutine, public ncvar_mf6attr(ncid, varid, layer, iaux, nc_tag, nc_fname)
put variable internal attributes
subroutine define_gridmap(this)
create the file grid mapping container variable
subroutine create_timeseries(this, idt, iparam, iaux, layer, export_pkg)
create timeseries export variable
subroutine, public ncvar_gridmap(ncid, varid, gridmap_name, nc_fname)
put variable gridmap attributes
subroutine, public ncvar_chunk(ncid, varid, chunk_face, nc_fname)
define variable chunking
subroutine mesh_init(this, modelname, modeltype, modelfname, nc_fname, disenum, nctype, lenuni, iout)
initialize
subroutine mesh_destroy(this)
initialize
subroutine add_global_att(this)
create file (group) attributes
subroutine add_pkg_data(this)
determine packages to write gridded input
subroutine df_export(this)
define timeseries input variables
subroutine export_df(this, export_pkg)
define export package
subroutine export_input_arrays(this, pkgtype, pkgname, mempath, param_dfns)
write package gridded input data
subroutine define_dependent(this)
create the model layer dependent variables
subroutine, public ncvar_deflate(ncid, varid, deflate, shuffle, nc_fname)
define variable compression
subroutine create_mesh(this)
create the file mesh container variable
This module contains the NCModelExportModule.
character(len=linelength) function, public export_varname(pkgname, tagname, mempath, layer, iaux)
build netcdf variable name
character(len=linelength) function, public export_longname(longname, pkgname, tagname, mempath, layer, iaux)
build netcdf variable longname
This module contains the NetCDFCommonModule.
subroutine, public nf_verify(res, nc_fname)
error check a netcdf-fortran interface call
This module contains simulation methods.
subroutine, public store_warning(msg, substring)
Store warning message.
subroutine, public store_error(msg, terminate)
Store an error message.
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
character(len=linelength) idm_context
character(len=maxcharlen) warnmsg
warning message string
This module contains the SourceCommonModule.
character(len=lencomponentname) function, public idm_subcomponent_type(component, subcomponent)
component from package or model type
This class is used to store a single deferred-length character string. It was designed to work in an ...
base ugrid netcdf export type
type for storing model export dimension ids
type for storing model export variable ids
abstract type for model netcdf export type