34 integer(I4B) :: nmesh_node
35 integer(I4B) :: nmesh_face
36 integer(I4B) :: max_nmesh_face_nodes
46 integer(I4B) :: mesh_node_x
47 integer(I4B) :: mesh_node_y
48 integer(I4B) :: mesh_face_x
49 integer(I4B) :: mesh_face_y
50 integer(I4B) :: mesh_face_xbnds
51 integer(I4B) :: mesh_face_ybnds
52 integer(I4B) :: mesh_face_nodes
54 integer(I4B),
dimension(:),
allocatable :: dependent
64 integer(I4B),
pointer :: chunk_face
82 character(len=*),
intent(in) :: pkgtype
83 character(len=*),
intent(in) :: pkgname
84 character(len=*),
intent(in) :: mempath
98 subroutine mesh_init(this, modelname, modeltype, modelfname, disenum, &
102 character(len=*),
intent(in) :: modelname
103 character(len=*),
intent(in) :: modeltype
104 character(len=*),
intent(in) :: modelfname
105 integer(I4B),
intent(in) :: disenum
106 integer(I4B),
intent(in) :: nctype
107 integer(I4B),
intent(in) :: iout
108 logical(LGP) :: found
111 call this%NCModelExportType%init(modelname, modeltype, modelfname, disenum, &
115 allocate (this%chunk_face)
119 if (this%ncf_mempath /=
'')
then
120 call mem_set_value(this%chunk_face,
'CHUNK_FACE', this%ncf_mempath, found)
123 if (this%chunk_time > 0 .and. this%chunk_face > 0)
then
124 this%chunking_active = .true.
128 call nf_verify(nf90_create(this%nc_fname, &
129 iand(nf90_clobber, nf90_netcdf4), this%ncid), &
139 call nf_verify(nf90_close(this%ncid), this%nc_fname)
141 deallocate (this%chunk_face)
142 nullify (this%chunk_face)
150 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'title', &
151 this%annotation%title), this%nc_fname)
153 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'source', &
154 this%annotation%source), this%nc_fname)
156 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow6_grid', &
157 this%annotation%grid), this%nc_fname)
159 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow6_model', &
160 this%annotation%model), this%nc_fname)
162 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'history', &
163 this%annotation%history), this%nc_fname)
165 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'Conventions', &
166 this%annotation%conventions), &
175 character(len=*),
intent(in) :: pkgtype
176 character(len=*),
intent(in) :: pkgname
177 character(len=*),
intent(in) :: mempath
179 intent(in) :: param_dfns
181 integer(I4B) :: iparam, isize
184 do iparam = 1,
size(param_dfns)
186 idt => param_dfns(iparam)
188 if (idt%blockname ==
'GRIDDATA')
then
190 call get_isize(idt%mf6varname, mempath, isize)
193 call this%export_input_array(pkgtype, pkgname, mempath, idt)
209 character(LENCOMPONENTNAME) :: ptype, pname, pkgtype
210 character(len=LENMEMPATH) :: input_mempath
212 pointer :: pkgtypes => null()
214 pointer :: pkgnames => null()
216 pointer :: mempaths => null()
218 character(len=LENMEMPATH) :: mempath
220 integer(I4B),
pointer :: export_arrays
221 logical(LGP) :: found
226 call mem_setptr(pkgtypes,
'PKGTYPES', input_mempath)
227 call mem_setptr(pkgnames,
'PKGNAMES', input_mempath)
228 call mem_setptr(mempaths,
'MEMPATHS', input_mempath)
230 allocate (export_arrays)
232 do n = 1,
size(mempaths)
238 mempath = mempaths(n)
243 if (mempath /=
'')
then
245 call mem_set_value(export_arrays,
'EXPORT_NC', mempath, found)
247 if (export_arrays > 0)
then
249 param_dfns => param_definitions(this%modeltype, pkgtype)
250 call this%export_input_arrays(ptype, pname, mempath, param_dfns)
256 deallocate (export_arrays)
263 character(len=LINELENGTH) :: varname, longname
274 write (varname,
'(a,i0)') trim(this%xname)//
'_l', k
275 write (longname,
'(a,i0,a)') trim(this%annotation%longname)// &
279 call nf_verify(nf90_def_var(this%ncid, varname, nf90_double, &
280 (/this%dim_ids%nmesh_face, &
281 this%dim_ids%time/), &
282 this%var_ids%dependent(k)), &
286 if (this%chunking_active)
then
287 call nf_verify(nf90_def_var_chunking(this%ncid, &
288 this%var_ids%dependent(k), &
291 this%chunk_time/)), &
295 call ncvar_deflate(this%ncid, this%var_ids%dependent(k), this%deflate, &
296 this%shuffle, this%nc_fname)
299 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
300 'units',
'm'), this%nc_fname)
301 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
302 'standard_name', this%annotation%stdname), &
304 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
305 'long_name', longname), this%nc_fname)
306 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
309 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
310 'mesh', this%mesh_name), this%nc_fname)
311 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
312 'location',
'face'), this%nc_fname)
316 this%gridmap_name, this%nc_fname)
324 integer(I4B) :: var_id
327 if (this%ogc_wkt /=
'')
then
330 call nf_verify(nf90_redef(this%ncid), this%nc_fname)
331 call nf_verify(nf90_def_var(this%ncid, this%gridmap_name, nf90_int, &
332 var_id), this%nc_fname)
337 call nf_verify(nf90_put_att(this%ncid, var_id,
'wkt', this%ogc_wkt), &
339 call nf_verify(nf90_enddef(this%ncid), this%nc_fname)
340 call nf_verify(nf90_put_var(this%ncid, var_id, 1), &
351 call nf_verify(nf90_def_var(this%ncid, this%mesh_name, nf90_int, &
352 this%var_ids%mesh), this%nc_fname)
355 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'cf_role', &
356 'mesh_topology'), this%nc_fname)
357 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'long_name', &
358 '2D mesh topology'), this%nc_fname)
359 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
360 'topology_dimension', 2), this%nc_fname)
361 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'face_dimension', &
362 'nmesh_face'), this%nc_fname)
363 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
364 'node_coordinates',
'mesh_node_x mesh_node_y'), &
366 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
367 'face_coordinates',
'mesh_face_x mesh_face_y'), &
369 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
370 'face_node_connectivity',
'mesh_face_nodes'), &
374 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_x', nf90_double, &
375 (/this%dim_ids%nmesh_node/), &
376 this%var_ids%mesh_node_x), this%nc_fname)
379 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
380 'units',
'm'), this%nc_fname)
381 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
382 'standard_name',
'projection_x_coordinate'), &
384 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
385 'long_name',
'Easting'), this%nc_fname)
387 if (this%ogc_wkt /=
'')
then
389 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
390 'grid_mapping', this%gridmap_name), &
395 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_y', nf90_double, &
396 (/this%dim_ids%nmesh_node/), &
397 this%var_ids%mesh_node_y), this%nc_fname)
400 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
401 'units',
'm'), this%nc_fname)
402 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
403 'standard_name',
'projection_y_coordinate'), &
405 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
406 'long_name',
'Northing'), this%nc_fname)
408 if (this%ogc_wkt /=
'')
then
410 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
411 'grid_mapping', this%gridmap_name), &
416 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_x', nf90_double, &
417 (/this%dim_ids%nmesh_face/), &
418 this%var_ids%mesh_face_x), this%nc_fname)
421 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
422 'units',
'm'), this%nc_fname)
423 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
424 'standard_name',
'projection_x_coordinate'), &
426 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
427 'long_name',
'Easting'), this%nc_fname)
428 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x,
'bounds', &
429 'mesh_face_xbnds'), this%nc_fname)
430 if (this%ogc_wkt /=
'')
then
432 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
433 'grid_mapping', this%gridmap_name), &
438 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_xbnds', nf90_double, &
439 (/this%dim_ids%max_nmesh_face_nodes, &
440 this%dim_ids%nmesh_face/), &
441 this%var_ids%mesh_face_xbnds), &
445 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_y', nf90_double, &
446 (/this%dim_ids%nmesh_face/), &
447 this%var_ids%mesh_face_y), this%nc_fname)
450 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
451 'units',
'm'), this%nc_fname)
452 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
453 'standard_name',
'projection_y_coordinate'), &
455 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
456 'long_name',
'Northing'), this%nc_fname)
457 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y,
'bounds', &
458 'mesh_face_ybnds'), this%nc_fname)
460 if (this%ogc_wkt /=
'')
then
462 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
463 'grid_mapping', this%gridmap_name), &
468 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_ybnds', nf90_double, &
469 (/this%dim_ids%max_nmesh_face_nodes, &
470 this%dim_ids%nmesh_face/), &
471 this%var_ids%mesh_face_ybnds), &
475 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_nodes', nf90_int, &
476 (/this%dim_ids%max_nmesh_face_nodes, &
477 this%dim_ids%nmesh_face/), &
478 this%var_ids%mesh_face_nodes), &
482 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
483 'cf_role',
'face_node_connectivity'), &
485 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
487 'Vertices bounding cell (counterclockwise)'), &
489 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
490 '_FillValue', (/nf90_fill_int/)), &
492 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
493 'start_index', 1), this%nc_fname)
499 integer(I4B),
intent(in) :: ncid
500 integer(I4B),
intent(in) :: varid
501 integer(I4B),
intent(in) :: chunk_face
502 character(len=*),
intent(in) :: nc_fname
505 if (chunk_face > 0)
then
506 call nf_verify(nf90_def_var_chunking(ncid, varid, nf90_chunked, &
507 (/chunk_face/)), nc_fname)
514 integer(I4B),
intent(in) :: ncid
515 integer(I4B),
intent(in) :: varid
516 integer(I4B),
intent(in) :: deflate
517 integer(I4B),
intent(in) :: shuffle
518 character(len=*),
intent(in) :: nc_fname
520 if (deflate >= 0)
then
521 call nf_verify(nf90_def_var_deflate(ncid, varid, shuffle=shuffle, &
522 deflate=1, deflate_level=deflate), &
530 integer(I4B),
intent(in) :: ncid
531 integer(I4B),
intent(in) :: varid
532 character(len=*),
intent(in) :: gridmap_name
533 character(len=*),
intent(in) :: nc_fname
535 if (gridmap_name /=
'')
then
536 call nf_verify(nf90_put_att(ncid, varid,
'coordinates', &
537 'mesh_face_x mesh_face_y'), nc_fname)
538 call nf_verify(nf90_put_att(ncid, varid,
'grid_mapping', &
539 gridmap_name), nc_fname)
546 integer(I4B),
intent(in) :: ncid
547 integer(I4B),
intent(in) :: varid
548 integer(I4B),
intent(in) :: layer
549 integer(I4B),
intent(in) :: iper
550 integer(I4B),
intent(in) :: iaux
551 character(len=*),
intent(in) :: nc_tag
552 character(len=*),
intent(in) :: nc_fname
554 if (nc_tag /=
'')
then
555 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_input', &
558 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_layer', &
563 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_iper', &
568 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_iaux', &
578 character(len=*),
intent(in) :: varname
579 integer(I4B),
optional,
intent(in) :: layer
580 integer(I4B),
optional,
intent(in) :: iper
581 integer(I4B),
optional,
intent(in) :: iaux
582 character(len=LINELENGTH) :: vname
586 if (varname /=
'')
then
589 if (
present(layer))
then
591 write (vname,
'(a,i0)') trim(vname)//
'_l', layer
594 if (
present(iper))
then
596 write (vname,
'(a,i0)') trim(vname)//
'_p', iper
599 if (
present(iaux))
then
601 write (vname,
'(a,i0)') trim(vname)//
'a', 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
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 define_gridmap(this)
create the file grid mapping container variable
character(len=linelength) function, public export_varname(varname, layer, iper, iaux)
build netcdf variable name
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, disenum, nctype, 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 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, public ncvar_mf6attr(ncid, varid, layer, iper, iaux, nc_tag, nc_fname)
put variable internal attributes
subroutine create_mesh(this)
create the file mesh container variable
This module contains the NCModelExportModule.
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_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
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