168 character(len=255) :: info
172 write(info,
'(a)')
"error while initializing mpi"
173 call error_stop(info)
176 call mpi_comm_size(mpi_comm_world,ig_ncpu,ios)
177 write(cg_ncpu,
'(i6.6)') ig_ncpu
179 call mpi_comm_rank(mpi_comm_world,ig_myrank,ios)
180 write(cg_myrank,
'(i6.6)') ig_myrank
182 call mpi_get_processor_name(cg_cpu_name,ig_cpu_name_len,ios)
206 integer :: unit_input_file
210 logical :: is_material_defined = .false.
211 logical :: is_file_exist = .false.
212 logical :: is_activate_dcs = .false.
213 logical :: is_activate_sfs = .false.
215 character(len=100) :: buffer_line
216 character(len=100) :: buffer_value
217 character(len=100) :: keyword
218 character(len=255) :: info
222 if (ig_lagrange_order < 4 .or. ig_lagrange_order > 6)
then
223 write(info,
'(a)')
"error while checking order of lagrange polynomial"
224 call error_stop(info)
229 open(unit=100,file=
"prefix",iostat=ios)
231 write(info,
'(a)')
"error while opening file prefix"
232 call error_stop(info)
234 read(unit=100,fmt=*),cg_prefix
235 cg_prefix = trim(adjustl(cg_prefix))
247 open(unit=get_newunit(unit_input_file),file=trim(cg_prefix)//
".cfg",status=
'old',iostat=ios)
249 write(info,
'(a)')
"error in subroutine init_input_variables while opening file *.cfg"
250 call error_stop(info)
257 read(unit=unit_input_file,fmt=
'(a)',iostat=ios) buffer_line
260 buffer_line = trim(adjustl(buffer_line))
261 pos = scan(buffer_line,
'=')
263 keyword = strlowcase(buffer_line(1:pos-1))
264 buffer_value = buffer_line(pos+1:100)
269 selectcase(trim(sweep_blanks(keyword)))
271 case(
"durationofsimulation")
272 read(buffer_value,*) rg_simu_total_time
275 read(buffer_value,*) rg_dt
278 case(
"receiversavingincrement")
279 read(buffer_value,*) ig_receiver_saving_incr
281 case(
"snapshotsavingincrement",
"surfacesnapshotsavingincrement")
282 read(buffer_value,*) ig_snapshot_saving_incr
284 case(
"snapshotspaceincrement",
"surfacesnapshotspaceincrement")
285 read(buffer_value,*) rg_receiver_snapshot_dxdy
287 case(
"snapshotdisplacement",
"surfacesnapshotdisplacement")
288 read(buffer_value,*) lg_snapshot_displacement
290 case(
"snapshotvelocity",
"surfacesnapshotvelocity")
291 read(buffer_value,*) lg_snapshot_velocity
293 case(
"snapshotacceleration",
"surfacesnapshotacceleration")
294 read(buffer_value,*) lg_snapshot_acceleration
296 case(
"volumesnapshotsavingincrement")
297 read(buffer_value,*) ig_snapshot_volume_saving_incr
299 case(
"volumesnapshotdisplacement")
300 read(buffer_value,*) lg_snapshot_volume_displacement
302 case(
"volumesnapshotvelocity")
303 read(buffer_value,*) lg_snapshot_volume_velocity
305 case(
"volumesnapshotacceleration")
306 read(buffer_value,*) lg_snapshot_volume_acceleration
308 case(
"volumesnapshotxmin")
309 read(buffer_value,*) rg_snapshot_volume_xmin
311 case(
"volumesnapshotxmax")
312 read(buffer_value,*) rg_snapshot_volume_xmax
314 case(
"volumesnapshotymin")
315 read(buffer_value,*) rg_snapshot_volume_ymin
317 case(
"volumesnapshotymax")
318 read(buffer_value,*) rg_snapshot_volume_ymax
320 case(
"volumesnapshotzmin")
321 read(buffer_value,*) rg_snapshot_volume_zmin
323 case(
"volumesnapshotzmax")
324 read(buffer_value,*) rg_snapshot_volume_zmax
326 case(
"boundaryabsorption")
327 read(buffer_value,*) lg_boundary_absorption
329 case(
"numberofmaterial")
330 read(buffer_value,*) ig_nmaterial
331 if (.not.
allocated(tg_elastic_material))
allocate(tg_elastic_material(ig_nmaterial))
332 if (.not.
allocated(ig_material_type))
allocate(ig_material_type(ig_nmaterial))
333 if (.not.
allocated(tg_viscoelastic_material) .and. lg_visco)
allocate(tg_viscoelastic_material(ig_nmaterial))
336 read(buffer_value,*) imat
337 is_material_defined = .true.
338 if (.not.lg_visco)
then
339 ig_material_type(imat) = 1
341 ig_material_type(imat) = 2
345 read(buffer_value,*) tg_elastic_material(imat)%svel
348 read(buffer_value,*) tg_elastic_material(imat)%pvel
351 read(buffer_value,*) tg_elastic_material(imat)%dens
355 read(buffer_value,*) tg_viscoelastic_material(imat)%freq
360 read(buffer_value,*) tg_viscoelastic_material(imat)%qs
365 read(buffer_value,*) tg_viscoelastic_material(imat)%qp
374 close(unit_input_file)
382 if (rg_simu_total_time <= tiny_real)
then
383 write(info,
'(a)')
"error in subroutine init_input_variables: duration of simulation must be greater than TINY_REAL"
384 call error_stop(info)
387 do imat = 1,ig_nmaterial
389 if (tg_elastic_material(imat)%svel <= tiny_real)
then
390 write(info,
'(a)')
"error in subroutine init_input_variables: S-wave velocity must be greater than TINY_REAL"
391 call error_stop(info)
394 if (tg_elastic_material(imat)%pvel <= tiny_real)
then
395 write(info,
'(a)')
"error in subroutine init_input_variables: P-wave velocity must be greater than TINY_REAL"
396 call error_stop(info)
399 if (tg_elastic_material(imat)%dens <= tiny_real)
then
400 write(info,
'(a)')
"error in subroutine init_input_variables: density must be greater than TINY_REAL"
401 call error_stop(info)
405 if (tg_viscoelastic_material(imat)%freq <= tiny_real)
then
406 write(info,
'(a)')
"error in subroutine init_input_variables: frequency for viscoelastic material must be greater than TINY_REAL"
407 call error_stop(info)
409 if (tg_viscoelastic_material(imat)%qs <= tiny_real)
then
410 write(info,
'(a)')
"error in subroutine init_input_variables: shear-wave quality factor for viscoelastic material must be greater than TINY_REAL"
411 call error_stop(info)
413 if (tg_viscoelastic_material(imat)%qp <= tiny_real)
then
414 write(info,
'(a)')
"error in subroutine init_input_variables: pressure-wave quality factor for viscoelastic material must be greater than TINY_REAL"
415 call error_stop(info)
421 if (.not.(is_material_defined))
then
422 write(info,
'(a)')
"error in subroutine init_input_variables: no material defined"
423 call error_stop(info)
432 if (rg_dt > tiny_real)
then
442 inquire(file=trim(cg_prefix)//
".dcs", exist=is_file_exist)
443 if(is_file_exist)
then
444 is_activate_dcs = .true.
447 inquire(file=trim(cg_prefix)//
".sfs", exist=is_file_exist)
448 if(is_file_exist)
then
449 is_activate_sfs = .true.
452 if (.not.(is_activate_dcs) .and. .not.(is_activate_sfs))
then
453 write(info,
'(a)')
"error in subroutine init_input_variables: no source defined"
454 call error_stop(info)
480 real,
intent(in) :: t
481 real,
intent(in) :: dt
484 ig_ndt = int(t/dt) + 1
508 ig_receiver_saving_incr&
509 ,ig_snapshot_saving_incr&
511 ,lg_snapshot_displacement&
512 ,lg_snapshot_velocity&
513 ,lg_snapshot_acceleration&
514 ,ig_snapshot_volume_saving_incr&
516 ,lg_snapshot_volume_displacement&
517 ,lg_snapshot_volume_velocity&
518 ,lg_snapshot_volume_acceleration
522 integer,
intent(in) :: ndt
524 if (ig_receiver_saving_incr == 0)
then
526 ig_receiver_saving_incr = ndt + 10
530 if ( (ig_snapshot_saving_incr == 0) .or. (.not.lg_snapshot_displacement .and. .not.lg_snapshot_velocity .and. .not.lg_snapshot_acceleration) )
then
532 ig_snapshot_saving_incr = ndt + 10
533 lg_snapshot = .false.
534 lg_snapshot_displacement = .false.
535 lg_snapshot_velocity = .false.
536 lg_snapshot_acceleration = .false.
544 if ( (ig_snapshot_volume_saving_incr == 0) .or. (.not.lg_snapshot_volume_displacement .and. .not.lg_snapshot_volume_velocity .and. .not.lg_snapshot_volume_acceleration) )
then
546 ig_snapshot_volume_saving_incr = ndt + 10
547 lg_snapshot_volume = .false.
548 lg_snapshot_volume_displacement = .false.
549 lg_snapshot_volume_velocity = .false.
550 lg_snapshot_volume_acceleration = .false.
554 lg_snapshot_volume = .true.
585 ,rg_gll_abscissa_dist&
588 ,rg_gll_lagrange_deriv&
599 real,
parameter :: eps = 1.0e-7
600 real,
allocatable ,
dimension(:) :: xold
601 real,
dimension(IG_NGLL,IG_NGLL) :: vandermonde_matrix
611 n = ig_lagrange_order
628 rg_gll_abscissa(i) = cos(rg_pi*
real(i-1)/
real(n))
632 vandermonde_matrix(:,:) = 0.0
637 do while (maxval(abs(rg_gll_abscissa-xold)) > eps)
639 xold(:) = rg_gll_abscissa(:)
640 vandermonde_matrix(:,1) = 1.0
641 vandermonde_matrix(:,2) = rg_gll_abscissa(:)
644 vandermonde_matrix(:,k+1) = ( (2.0*
real(k)-1.0)*rg_gll_abscissa(:)*vandermonde_matrix(:,k)-(
real(k)-1.0)*vandermonde_matrix(:,k-1) )/
real(k)
647 rg_gll_abscissa(:) = xold(:)-( rg_gll_abscissa(:)*vandermonde_matrix(:,ngll)-vandermonde_matrix(:,n) )/( ngll*vandermonde_matrix(:,ngll) )
652 rg_gll_weight(:) = 2.0/(n*ngll*vandermonde_matrix(:,ngll)**2)
659 if (ig_myrank == 0)
then
660 write(ig_lst_unit,
'(" ",/,a)')
" --> abscissa of GLLs - weight of GLLs"
662 write(ig_lst_unit,fmt=
'(2(7X,f10.7))') rg_gll_abscissa(i),rg_gll_weight(i)
673 rg_gll_abscissa_dist(j,i) = 0.0
674 if (i /= j) rg_gll_abscissa_dist(j,i) =1.0/(rg_gll_abscissa(i) - rg_gll_abscissa(j))
687 rg_gll_lagrange_deriv(j,i) =
lagrad(j,rg_gll_abscissa(i),ig_ngll)
716 ,ig_hexa_gnode_xiloc&
717 ,ig_hexa_gnode_etloc&
718 ,ig_hexa_gnode_zeloc&
721 ,ig_hexa_gnode_glonum&
727 ,lg_output_debug_file&
752 integer(kind=1),
dimension(ig_ngll_total) :: maskeq
760 ios =
init_array_real(rg_gll_coordinate,ig_ngll_total,ig_ndof,
"rg_gll_coordinate")
764 do ihexa = 1,ig_nhexa
770 igll = ig_hexa_gll_glonum(m,l,k,ihexa)
772 if (maskeq(igll) == 0)
then
774 do n = 1,ig_hexa_nnode
776 lag_xi =
lagrap_geom(ig_hexa_gnode_xiloc(n),rg_gll_abscissa(m),ig_line_nnode)
777 lag_eta =
lagrap_geom(ig_hexa_gnode_etloc(n),rg_gll_abscissa(l),ig_line_nnode)
778 lag_zeta =
lagrap_geom(ig_hexa_gnode_zeloc(n),rg_gll_abscissa(k),ig_line_nnode)
780 xgnode = rg_gnode_x(ig_hexa_gnode_glonum(n,ihexa))
781 ygnode = rg_gnode_y(ig_hexa_gnode_glonum(n,ihexa))
782 zgnode = rg_gnode_z(ig_hexa_gnode_glonum(n,ihexa))
784 rg_gll_coordinate(1,igll) = rg_gll_coordinate(1,igll) + lag_xi*lag_eta*lag_zeta*xgnode
786 rg_gll_coordinate(2,igll) = rg_gll_coordinate(2,igll) + lag_xi*lag_eta*lag_zeta*ygnode
788 rg_gll_coordinate(3,igll) = rg_gll_coordinate(3,igll) + lag_xi*lag_eta*lag_zeta*zgnode
802 if (lg_output_debug_file)
then
803 open(unit=100,file=
"debug."//trim(cg_prefix)//
".global.element.gll.coordinates.cpu."//trim(cg_myrank))
805 do ihexa = 1,ig_nhexa
810 igll = ig_hexa_gll_glonum(m,l,k,ihexa)
812 write(100,
'(3(f15.3,1x),i10)') rg_gll_coordinate(1,igll)&
813 ,rg_gll_coordinate(2,igll)&
814 ,rg_gll_coordinate(3,igll)&
815 ,ig_hexa_gll_glonum(m,l,k,ihexa)
847 ,ig_hexa_material_number&
848 ,rg_hexa_gll_jacobian_det&
854 ,ig_mpi_buffer_sizemax&
862 real ,
dimension(ig_mpi_buffer_sizemax) :: dummyr
863 real ,
dimension(ig_mpi_buffer_sizemax,ig_ncpu_neighbor) :: dlxmas
865 integer,
dimension(MPI_STATUS_SIZE) :: statut
875 if (ig_myrank == 0)
then
876 write(ig_lst_unit,
'(" ",/,a)')
"computing mass matrix..."
877 call flush(ig_lst_unit)
885 ios =
init_array_real(rg_gll_mass_matrix,ig_ngll_total,
"rg_gll_mass_matrix")
892 do ihexa = 1,ig_nhexa
897 igll = ig_hexa_gll_glonum(mgll,lgll,kgll,ihexa)
899 rg_gll_mass_matrix(igll) = rg_gll_mass_matrix(igll)&
900 + rg_hexa_gll_jacobian_det(mgll,lgll,kgll,ihexa)*rg_hexa_gll_rho(mgll,lgll,kgll,ihexa)&
901 * rg_gll_weight(mgll)*rg_gll_weight(lgll)*rg_gll_weight(kgll)
911 do icon = 1,ig_ncpu_neighbor
912 do igll = 1,tg_cpu_neighbor(icon)%ngll
914 kgll = tg_cpu_neighbor(icon)%gll_send(igll)
915 dlxmas(igll,icon) = rg_gll_mass_matrix(kgll)
924 do icon = 1,ig_ncpu_neighbor
926 ngll = tg_cpu_neighbor(icon)%ngll
928 call mpi_sendrecv(dlxmas(1,icon),ngll,mpi_real,tg_cpu_neighbor(icon)%icpu,100,dummyr,ngll,mpi_real,tg_cpu_neighbor(icon)%icpu,100,mpi_comm_world,statut,ios)
932 kgll = tg_cpu_neighbor(icon)%gll_recv(igll)
933 rg_gll_mass_matrix(kgll) = rg_gll_mass_matrix(kgll) + dummyr(igll)
944 rg_gll_mass_matrix(:) = 1.0/rg_gll_mass_matrix(:)
946 if (ig_myrank == 0)
then
947 write(ig_lst_unit,
'(a)')
"done"
948 call flush(ig_lst_unit)
985 ,ig_hexa_gnode_xiloc&
986 ,ig_hexa_gnode_etloc&
987 ,ig_hexa_gnode_zeloc&
990 ,rg_hexa_gll_jacobian_det&
1015 real ,
parameter :: eps = 1.0e-8
1036 if (ig_myrank == 0)
then
1037 write(ig_lst_unit,
'(" ",/,a)')
"computing jacobian matrix in hexa..."
1038 call flush(ig_lst_unit)
1046 ios =
init_array_real(rg_hexa_gll_jacobian_det,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_jacobian_det")
1048 ios =
init_array_real(rg_hexa_gll_dxidx,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_dxidx")
1050 ios =
init_array_real(rg_hexa_gll_dxidy,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_dxidy")
1052 ios =
init_array_real(rg_hexa_gll_dxidz,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_dxidz")
1054 ios =
init_array_real(rg_hexa_gll_detdx,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_detdx")
1056 ios =
init_array_real(rg_hexa_gll_detdy,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_detdy")
1058 ios =
init_array_real(rg_hexa_gll_detdz,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_detdz")
1060 ios =
init_array_real(rg_hexa_gll_dzedx,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_dzedx")
1062 ios =
init_array_real(rg_hexa_gll_dzedy,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_dzedy")
1064 ios =
init_array_real(rg_hexa_gll_dzedz,ig_nhexa,ig_ngll,ig_ngll,ig_ngll,
"rg_hexa_gll_dzedz")
1072 do ihexa = 1,ig_nhexa
1078 xi = rg_gll_abscissa(m)
1079 eta = rg_gll_abscissa(l)
1080 zeta = rg_gll_abscissa(k)
1082 call
compute_hexa_jacobian(ihexa,xi,eta,zeta,dxidx,dxidy,dxidz,detdx,detdy,detdz,dzedx,dzedy,dzedz,det)
1084 rg_hexa_gll_jacobian_det(m,l,k,ihexa) = det
1086 rg_hexa_gll_dxidx(m,l,k,ihexa) = dxidx
1087 rg_hexa_gll_dxidy(m,l,k,ihexa) = dxidy
1088 rg_hexa_gll_dxidz(m,l,k,ihexa) = dxidz
1090 rg_hexa_gll_detdx(m,l,k,ihexa) = detdx
1091 rg_hexa_gll_detdy(m,l,k,ihexa) = detdy
1092 rg_hexa_gll_detdz(m,l,k,ihexa) = detdz
1094 rg_hexa_gll_dzedx(m,l,k,ihexa) = dzedx
1095 rg_hexa_gll_dzedy(m,l,k,ihexa) = dzedy
1096 rg_hexa_gll_dzedz(m,l,k,ihexa) = dzedz
1104 if (ig_myrank == 0)
then
1105 write(ig_lst_unit,
'(a)')
"done"
1106 call flush(ig_lst_unit)
1134 ,ig_quad_gnode_xiloc&
1135 ,ig_quad_gnode_etloc&
1137 ,rg_quadp_gll_jaco_det&
1138 ,rg_quadp_gll_normal&
1142 ,ig_quadp_gnode_glonum&
1144 ,lg_boundary_absorption
1154 real ,
parameter :: eps = 1.0e-8
1167 real :: lag_deriv_xi
1168 real :: lag_deriv_et
1187 if (lg_boundary_absorption .and. ig_nquad_parax > 0)
then
1189 if (ig_myrank == 0)
then
1190 write(ig_lst_unit,
'(" ",/,a)')
"computing jacobian matrix in quad..."
1191 call flush(ig_lst_unit)
1199 ios =
init_array_real(rg_quadp_gll_jaco_det,ig_nquad_parax,ig_ngll,ig_ngll,
"rg_quadp_gll_jaco_det")
1201 ios =
init_array_real(rg_quadp_gll_normal,ig_nquad_parax,ig_ngll,ig_ngll,3,
"rg_quadp_gll_normal")
1209 do iquad = 1,ig_nquad_parax
1220 do m = 1,ig_quad_nnode
1222 lag_deriv_xi =
lagrad_geom(ig_quad_gnode_xiloc(m),rg_gll_abscissa(l),ig_line_nnode)
1223 lag_deriv_et =
lagrad_geom(ig_quad_gnode_etloc(m),rg_gll_abscissa(k),ig_line_nnode)
1225 lag_xi =
lagrap_geom(ig_quad_gnode_xiloc(m),rg_gll_abscissa(l),ig_line_nnode)
1226 lag_et =
lagrap_geom(ig_quad_gnode_etloc(m),rg_gll_abscissa(k),ig_line_nnode)
1228 xgnode = rg_gnode_x(ig_quadp_gnode_glonum(m,iquad))
1229 ygnode = rg_gnode_y(ig_quadp_gnode_glonum(m,iquad))
1230 zgnode = rg_gnode_z(ig_quadp_gnode_glonum(m,iquad))
1232 xxi = xxi + lag_deriv_xi*lag_et*xgnode
1233 yxi = yxi + lag_deriv_xi*lag_et*ygnode
1234 zxi = zxi + lag_deriv_xi*lag_et*zgnode
1236 xet = xet + lag_xi*lag_deriv_et*xgnode
1237 yet = yet + lag_xi*lag_deriv_et*ygnode
1238 zet = zet + lag_xi*lag_deriv_et*zgnode
1242 crprx = yxi*zet - zxi*yet
1243 crpry = zxi*xet - xxi*zet
1244 crprz = xxi*yet - yxi*xet
1246 det = sqrt(crprx**2 + crpry**2 + crprz**2)
1250 write(*,*)
"***error in jacobi quad: det null or negative, det = ",det
1251 write(*,*)
"***element ",iquad,
"cpu ",ig_myrank
1252 call mpi_abort(mpi_comm_world,100,ios)
1257 rg_quadp_gll_jaco_det(l,k,iquad) = det
1260 vn(1) = crprx*inv_det
1261 vn(2) = crpry*inv_det
1262 vn(3) = crprz*inv_det
1264 rg_quadp_gll_normal(1,l,k,iquad) = vn(1)
1265 rg_quadp_gll_normal(2,l,k,iquad) = vn(2)
1266 rg_quadp_gll_normal(3,l,k,iquad) = vn(3)
1272 if (ig_myrank == 0)
then
1273 write(ig_lst_unit,
'(a)')
"done"
1274 call flush(ig_lst_unit)
subroutine, public init_input_variables()
This subroutine initializes the simulation by writing header of listing file *.lst and reading variab...
This module contains subroutines to allocate arrays and to compute an approximation of the total RAM ...
subroutine, public init_gll_nodes()
This subroutine computes GLL nodes abscissa and weight in the reference domain [-1:1] as well as deri...
subroutine, public init_mpi()
This subroutine initializes MPI.
subroutine, public compute_hexa_jacobian(ihexa, xisol, etsol, zesol, dxidx, dxidy, dxidz, detdx, detdy, detdz, dzedx, dzedy, dzedz, det)
This subroutine computes jacobian matrix and its determinant at location in hexahedron element ihexa...
real function, public lagrad_geom(i, x, n)
function to compute value of the derivative of order Lagrange polynomial of geometric node i at absc...
subroutine, public write_header()
subroutine that writes the header of the listing file (*.lst).
This module defines all global variables of EFISPEC3D. Scalar variables are initialized directly in t...
subroutine, public init_jacobian_matrix_quad()
This subroutine computes the determinant of Jacobian matrix and normal unit vector of quadrangle elem...
Interface init_array_real to redirect allocation to n-rank arrays.
subroutine, public write_temporal_domain_info()
subroutine that writes temporal information about the simulation in the listing file (*...
subroutine, public init_temporal_saving(ndt)
This subroutine set saving information for receivers and snapshots.
This module contains subroutines to initialize some global variable vectors and matrices.
real function, public lagrap_geom(i, x, n)
function to compute value of order Lagrange polynomial of geometric node i at abscissa : ...
subroutine, public init_gll_nodes_coordinates()
This subroutine computes GLL nodes -coordinates in the physical domain, cartesian right-handed coordi...
This module contains subroutines to write information in the listing file *.lst.
subroutine, public init_temporal_domain(t, dt)
This subroutine initializes the number of time step of the simulation and the squared time step...
This module contains functions to compute Lagrange polynomials and its derivatives; and to interpolat...
This module contains subroutines to compute jacobian matrix.
real function, public lagrad(i, x, n)
function to compute value of the derivative of order Lagrange polynomial of GLL node i at abscissa ...
subroutine, public init_mass_matrix()
This subroutine computes and assembles the mass matrix of the system .
subroutine, public init_jacobian_matrix_hexa()
This subroutine computes Jacobian matrix and its determinant for hexahedron elements.