7 use hecmw,
only : kint, kreal, hecmw_abort, hecmw_comm_get_comm
20 integer(kind=kint),
parameter :: MAX_TYING_TERMS = 64
22 integer(kind=kint),
parameter :: SHELL_XI = 1_kint
23 integer(kind=kint),
parameter :: SHELL_ETA = 2_kint
24 integer(kind=kint),
parameter :: SHELL_ZETA = 3_kint
65 pure function outer_product3(a, b)
result(ab)
67 real(kind = kreal),
intent(in) :: a(3), b(3)
68 real(kind = kreal) :: ab(3, 3)
77 end function outer_product3
81 pure function shellmitc_symmetriccomponents(matrix)
result(components)
82 real(kind=kreal),
intent(in) :: matrix(3, 3)
83 real(kind=kreal) :: components(5)
85 components = (/ matrix(1, 1), matrix(2, 2), matrix(1, 2)+matrix(2, 1), matrix(2, 3)+matrix(3, 2), &
86 matrix(3, 1)+matrix(1, 3) /)
87 end function shellmitc_symmetriccomponents
91 pure real(kind=kreal) function shellmitc_covariantjacobian(covariant_basis)
92 real(kind=kreal),
intent(in) :: covariant_basis(3, 3)
94 shellmitc_covariantjacobian = covariant_basis(1, shell_xi) &
95 *(covariant_basis(2, shell_eta)*covariant_basis(3, shell_zeta) &
96 -covariant_basis(3, shell_eta)*covariant_basis(2, shell_zeta)) +covariant_basis(2, shell_xi) &
97 *(covariant_basis(3, shell_eta)*covariant_basis(1, shell_zeta) &
98 -covariant_basis(1, shell_eta)*covariant_basis(3, shell_zeta)) +covariant_basis(3, shell_xi) &
99 *(covariant_basis(1, shell_eta)*covariant_basis(2, shell_zeta) &
100 -covariant_basis(2, shell_eta)*covariant_basis(1, shell_zeta))
101 end function shellmitc_covariantjacobian
103 pure real(kind=kreal) function shellmitc_tyingzeta(etype, zeta)
104 integer(kind=kint),
intent(in) :: etype
105 real(kind=kreal),
intent(in) :: zeta
107 shellmitc_tyingzeta = 0.0d0
109 end function shellmitc_tyingzeta
114 subroutine shellmitc_resolveformulation(etype, nn, ndof, gauss, has_nodal_state, &
115 has_element_state, require_layer_state, kinematics, ndof_shell, finite_rotation, &
116 use_director_tangent, use_green_lagrange, add_geometric_stiffness, update_state)
121 integer(kind=kint),
intent(in) :: etype, nn, ndof
122 type(tGaussStatus),
intent(in) :: gauss
123 logical,
intent(in) :: has_nodal_state, has_element_state, require_layer_state
124 integer(kind=kint),
intent(out) :: kinematics, ndof_shell
125 logical,
intent(out) :: finite_rotation, use_director_tangent, use_green_lagrange
126 logical,
intent(out) :: add_geometric_stiffness, update_state
128 kinematics = gauss%pMaterial%nlgeom_flag
130 ndof_shell = min(ndof, 6_kint)
133 use_director_tangent = finite_rotation
134 use_green_lagrange = kinematics ==
totallag .and. finite_rotation
136 update_state = finite_rotation .and. has_element_state
139 if( .not. finite_rotation )
call shellmitc_abortnonlinearunsupported(etype)
140 if( require_layer_state .and. .not. update_state )
then
141 call shellmitc_abortnonlinearunsupported(etype)
144 end subroutine shellmitc_resolveformulation
149 use_director_tangent, need_second_tangent, ecoord, nodal_state, ndtriad, ndreftriad, &
150 ndcurtriad, evaluation_coords, v1, v2, v3, director, reference_director, director_tangent, director_second_tangent)
154 integer(kind=kint),
intent(in) :: etype, nn, kinematics
155 real(kind=kreal),
intent(in) :: thick, ecoord(3, nn), nodal_state(6, nn)
156 logical,
intent(in) :: finite_rotation, use_director_tangent, need_second_tangent
157 real(kind=kreal),
intent(in),
optional :: ndtriad(9, nn), ndreftriad(9, nn), ndcurtriad(9, nn)
158 real(kind=kreal),
intent(out) :: evaluation_coords(3, nn)
159 real(kind=kreal),
intent(out) :: v1(3, nn), v2(3, nn), v3(3, nn)
160 real(kind=kreal),
intent(out) :: director(3, nn), reference_director(3, nn)
161 real(kind=kreal),
intent(out) :: director_tangent(3, 3, nn)
162 real(kind=kreal),
intent(out) :: director_second_tangent(3, 3, 3, nn)
164 evaluation_coords = ecoord
165 if( kinematics ==
updatelag ) evaluation_coords = evaluation_coords+nodal_state(1:3, :)
166 call shellmitc_setupnodaldirectors(etype, nn, thick, kinematics, evaluation_coords, &
167 nodal_state, finite_rotation, use_director_tangent, need_second_tangent, ndtriad, &
168 ndreftriad, ndcurtriad, v1, v2, v3, director, reference_director, director_tangent, director_second_tangent)
176 integer(kind=kint),
intent(in) :: nn
177 real(kind=kreal),
intent(in) :: coords(3, nn), director(3, nn)
178 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), shapederiv(nn, 2)
179 real(kind=kreal),
intent(out) :: covariant_basis(3, 3)
181 covariant_basis(:, shell_xi:shell_eta) = matmul(coords+zeta*director, shapederiv)
182 covariant_basis(:, shell_zeta) = matmul(director, shapefunc)
188 subroutine shellmitc_directorcontributions(nn, director, zeta, shapefunc, shapederiv, director_contribution)
191 integer(kind=kint),
intent(in) :: nn
192 real(kind=kreal),
intent(in) :: director(3, nn)
193 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), shapederiv(nn, 2)
194 real(kind=kreal),
intent(out) :: director_contribution(3, nn, 3)
199 director_contribution(:, node, shell_xi) = zeta*shapederiv(node, shell_xi)*director(:, node)
200 director_contribution(:, node, shell_eta) = zeta*shapederiv(node, shell_eta)*director(:, node)
201 director_contribution(:, node, shell_zeta) = shapefunc(node)*director(:, node)
203 end subroutine shellmitc_directorcontributions
204 pure subroutine shellmitc_basisfromcovariant(covariant_basis, local_basis, reciprocal_basis, det)
205 real(kind=kreal),
intent(in) :: covariant_basis(3, 3)
206 real(kind=kreal),
intent(out) :: local_basis(3, 3), reciprocal_basis(3, 3)
207 real(kind=kreal),
intent(out) :: det
209 real(kind=kreal) :: det_inv, basis_norm
211 det = shellmitc_covariantjacobian(covariant_basis)
214 reciprocal_basis(1, shell_xi) = det_inv *(covariant_basis(2, shell_eta)*covariant_basis(3, shell_zeta) &
215 -covariant_basis(3, shell_eta)*covariant_basis(2, shell_zeta))
216 reciprocal_basis(2, shell_xi) = det_inv *(covariant_basis(3, shell_eta)*covariant_basis(1, shell_zeta) &
217 -covariant_basis(1, shell_eta)*covariant_basis(3, shell_zeta))
218 reciprocal_basis(3, shell_xi) = det_inv *(covariant_basis(1, shell_eta)*covariant_basis(2, shell_zeta) &
219 -covariant_basis(2, shell_eta)*covariant_basis(1, shell_zeta))
220 reciprocal_basis(1, shell_eta) = det_inv *(covariant_basis(2, shell_zeta)*covariant_basis(3, shell_xi) &
221 -covariant_basis(3, shell_zeta)*covariant_basis(2, shell_xi))
222 reciprocal_basis(2, shell_eta) = det_inv *(covariant_basis(3, shell_zeta)*covariant_basis(1, shell_xi) &
223 -covariant_basis(1, shell_zeta)*covariant_basis(3, shell_xi))
224 reciprocal_basis(3, shell_eta) = det_inv *(covariant_basis(1, shell_zeta)*covariant_basis(2, shell_xi) &
225 -covariant_basis(2, shell_zeta)*covariant_basis(1, shell_xi))
226 reciprocal_basis(1, shell_zeta) = det_inv *(covariant_basis(2, shell_xi)*covariant_basis(3, shell_eta) &
227 -covariant_basis(3, shell_xi)*covariant_basis(2, shell_eta))
228 reciprocal_basis(2, shell_zeta) = det_inv *(covariant_basis(3, shell_xi)*covariant_basis(1, shell_eta) &
229 -covariant_basis(1, shell_xi)*covariant_basis(3, shell_eta))
230 reciprocal_basis(3, shell_zeta) = det_inv *(covariant_basis(1, shell_xi)*covariant_basis(2, shell_eta) &
231 -covariant_basis(2, shell_xi)*covariant_basis(1, shell_eta))
233 basis_norm = dsqrt(dot_product(covariant_basis(:, shell_zeta), covariant_basis(:, shell_zeta)))
234 local_basis(:, shell_zeta) = covariant_basis(:, shell_zeta)/basis_norm
235 local_basis(1, shell_xi) = covariant_basis(2, shell_eta)*local_basis(3, shell_zeta) &
236 -covariant_basis(3, shell_eta)*local_basis(2, shell_zeta)
237 local_basis(2, shell_xi) = covariant_basis(3, shell_eta)*local_basis(1, shell_zeta) &
238 -covariant_basis(1, shell_eta)*local_basis(3, shell_zeta)
239 local_basis(3, shell_xi) = covariant_basis(1, shell_eta)*local_basis(2, shell_zeta) &
240 -covariant_basis(2, shell_eta)*local_basis(1, shell_zeta)
241 basis_norm = dsqrt(dot_product(local_basis(:, shell_xi), local_basis(:, shell_xi)))
242 local_basis(:, shell_xi) = local_basis(:, shell_xi)/basis_norm
243 local_basis(1, shell_eta) = local_basis(2, shell_zeta)*local_basis(3, shell_xi) &
244 -local_basis(3, shell_zeta)*local_basis(2, shell_xi)
245 local_basis(2, shell_eta) = local_basis(3, shell_zeta)*local_basis(1, shell_xi) &
246 -local_basis(1, shell_zeta)*local_basis(3, shell_xi)
247 local_basis(3, shell_eta) = local_basis(1, shell_zeta)*local_basis(2, shell_xi) &
248 -local_basis(2, shell_zeta)*local_basis(1, shell_xi)
249 basis_norm = dsqrt(dot_product(local_basis(:, shell_eta), local_basis(:, shell_eta)))
250 local_basis(:, shell_eta) = local_basis(:, shell_eta)/basis_norm
251 end subroutine shellmitc_basisfromcovariant
257 subroutine shellmitc_preparepointkinematics(etype, nn, use_green_lagrange, reference_coords, &
258 evaluation_coords, translation, director, reference_director, zeta, shapefunc, &
259 shapederiv, covariant_basis, tangent_basis, reciprocal_basis, local_basis, &
260 material_reciprocal_basis, material_local_basis, integration_jacobian, director_contribution)
263 integer(kind=kint),
intent(in) :: etype, nn
264 logical,
intent(in) :: use_green_lagrange
265 real(kind=kreal),
intent(in) :: reference_coords(3, nn), evaluation_coords(3, nn)
266 real(kind=kreal),
intent(in) :: translation(3, nn), director(3, nn)
267 real(kind=kreal),
intent(in) :: reference_director(3, nn)
268 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), shapederiv(nn, 2)
269 real(kind=kreal),
intent(out) :: covariant_basis(3, 3), tangent_basis(3, 2)
270 real(kind=kreal),
intent(out) :: reciprocal_basis(3, 3), local_basis(3, 3)
271 real(kind=kreal),
intent(out) :: material_reciprocal_basis(3, 3)
272 real(kind=kreal),
intent(out) :: material_local_basis(3, 3)
273 real(kind=kreal),
intent(out) :: integration_jacobian
274 real(kind=kreal),
intent(out) :: director_contribution(3, nn, 3)
276 real(kind=kreal) :: reference_basis(3, 3), translation_gradient(3, 2)
277 real(kind=kreal) :: current_jacobian, material_jacobian
279 call shellmitc_directorcontributions(nn, director, zeta, shapefunc, shapederiv, director_contribution)
281 if( abs(shellmitc_covariantjacobian(covariant_basis)) <= tiny(1.0d0) ) &
282 stop
"Invalid shell Jacobian"
283 if( use_green_lagrange )
then
284 translation_gradient = matmul(translation, shapederiv)
285 covariant_basis(:, shell_xi:shell_eta) = covariant_basis(:, shell_xi:shell_eta)+translation_gradient
287 call shellmitc_basisfromcovariant(covariant_basis, local_basis, reciprocal_basis, current_jacobian)
289 tangent_basis = covariant_basis(:, shell_xi:shell_eta)
290 material_local_basis = local_basis
291 material_reciprocal_basis = reciprocal_basis
292 integration_jacobian = current_jacobian
294 if( .not. use_green_lagrange )
return
296 call shellmitc_covariantbasis(nn, reference_coords, reference_director, zeta, shapefunc, shapederiv, reference_basis)
297 call shellmitc_basisfromcovariant(reference_basis, material_local_basis, material_reciprocal_basis, material_jacobian)
298 integration_jacobian = shellmitc_covariantjacobian(reference_basis)
302 tangent_basis = tangent_basis + translation_gradient
304 covariant_basis(:, shell_xi:shell_eta) = covariant_basis(:, shell_xi:shell_eta) + translation_gradient
305 tangent_basis = covariant_basis(:, shell_xi:shell_eta)
307 end subroutine shellmitc_preparepointkinematics
311 subroutine shellmitc_evaluatepointstrain(nn, zeta, shapefunc, shapederiv, translation, &
312 director_increment, covariant_basis, use_green_lagrange, strain, reference_basis, &
313 current_basis, reference_jacobian, current_jacobian)
316 integer(kind=kint),
intent(in) :: nn
317 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), shapederiv(nn, 2)
318 real(kind=kreal),
intent(in) :: translation(3, nn), director_increment(3, nn)
319 real(kind=kreal),
intent(in) :: covariant_basis(3, 3)
320 logical,
intent(in) :: use_green_lagrange
321 real(kind=kreal),
intent(out) :: strain(5)
322 real(kind=kreal),
intent(out) :: reference_basis(3, 3), current_basis(3, 3)
323 real(kind=kreal),
intent(out) :: reference_jacobian, current_jacobian
325 real(kind=kreal) :: displacement_gradient(3, 3), translation_gradient(3, 2)
327 displacement_gradient(:, shell_xi:shell_eta) = matmul(translation+zeta*director_increment, shapederiv)
328 displacement_gradient(:, shell_zeta) = matmul(director_increment, shapefunc)
330 reference_basis = covariant_basis
331 current_basis = covariant_basis
333 if( use_green_lagrange )
then
334 translation_gradient = matmul(translation, shapederiv)
335 current_basis(:, shell_xi:shell_eta) = covariant_basis(:, shell_xi:shell_eta)+translation_gradient
336 reference_basis = current_basis-displacement_gradient
338 strain = 0.5d0*shellmitc_symmetriccomponents( matmul(transpose(current_basis), current_basis) &
339 -matmul(transpose(reference_basis), reference_basis))
341 strain = shellmitc_symmetriccomponents( matmul(transpose(covariant_basis), displacement_gradient))
344 reference_jacobian = shellmitc_covariantjacobian(reference_basis)
345 current_jacobian = shellmitc_covariantjacobian(current_basis)
347 end subroutine shellmitc_evaluatepointstrain
351 real(kind=kreal)
function shellplanestresstracecoeff( gauss, n_layer )
357 integer(kind=kint),
intent(in) :: n_layer
359 real(kind=kreal) :: nu, outa(2)
363 shellplanestresstracecoeff = 1.0d0
364 if( .not.
associated( gauss%pMaterial ) )
return
366 stop
"MITC4 shell UL orthotropic trace correction is not supported"
368 nu = gauss%pMaterial%variables(
m_poisson)
369 call fetch_tabledata(
mc_isoelastic, gauss%pMaterial%dict, outa, ierr)
370 if(
associated( gauss%pMaterial%shell_var ) )
then
371 if( n_layer >= 1 .and. n_layer <=
size( gauss%pMaterial%shell_var ) )
then
372 if( gauss%pMaterial%shell_var(n_layer)%ortho == 0 )
then
374 nu = gauss%pMaterial%shell_var(n_layer)%pp
379 stop
"MITC4 shell UL orthotropic trace correction is not supported"
381 else if( .not. ierr )
then
384 else if( .not. ierr )
then
388 if( abs(1.0d0-nu) > 1.0d-12 )
then
389 shellplanestresstracecoeff = (1.0d0-2.0d0*nu)/(1.0d0-nu)
392 end function shellplanestresstracecoeff
400 integer(kind=kint),
intent(in) :: etype, nn
401 real(kind=kreal),
intent(in) :: thick, elem(3, nn)
402 real(kind=kreal),
intent(out) :: v1(3, nn), v2(3, nn), v3(3, nn), director(3, nn)
405 real(kind=kreal) :: naturalcoord(2), nncoord(nn, 2), shapederiv(nn, 2)
406 real(kind=kreal) :: g1(3), g2(3), e0(3), normv
411 e0 = matmul(elem, shapederiv(:, 1))
414 naturalcoord = nncoord(nb, :)
416 g1 = matmul(elem, shapederiv(:, 1))
417 g2 = matmul(elem, shapederiv(:, 2))
420 normv = dsqrt(dot_product(v3(:, nb), v3(:, nb)))
421 v3(:, nb) = v3(:, nb)/normv
424 normv = dsqrt(dot_product(v2(:, nb), v2(:, nb)))
425 if (normv > 1.0d-15)
then
426 v2(:, nb) = v2(:, nb)/normv
428 normv = dsqrt(dot_product(v1(:, nb), v1(:, nb)))
429 v1(:, nb) = v1(:, nb)/normv
431 v1(:, nb) = (/ 0.0d0, 0.0d0, -1.0d0 /)
432 v2(:, nb) = (/ 0.0d0, 1.0d0, 0.0d0 /)
436 normv = dsqrt(dot_product(v3(:, nb), v3(:, nb)))
437 v3(:, nb) = v3(:, nb)/normv
438 director(:, nb) = 0.5d0*thick*v3(:, nb)
444 subroutine shellmitc_buildinterpolationmatrix(nn, ndof, zeta, shapefunc, director, N)
447 integer(kind=kint),
intent(in) :: nn, ndof
448 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), director(3, nn)
449 real(kind=kreal),
intent(out) :: n(3, ndof*nn)
452 real(kind=kreal) :: urot(3)
457 n(1, jsize+1) = shapefunc(nb)
458 n(2, jsize+2) = shapefunc(nb)
459 n(3, jsize+3) = shapefunc(nb)
461 urot = zeta*shapefunc(nb)*director(:, nb)
466 end subroutine shellmitc_buildinterpolationmatrix
473 subroutine shellmitc_setupnodaldirectors(etype, nn, thick, flag, elem, shell_disp, &
474 finite_rotation_director, use_director_tangent, need_second_tangent, ndtriad, ndreftriad, ndcurtriad, &
475 v1, v2, v3, a_over_2_v3, a_over_2_v3_ref, a_over_2_v3_deriv, a_over_2_v3_second)
479 integer,
intent(in) :: flag
480 integer(kind=kint),
intent(in) :: etype, nn
481 real(kind=kreal),
intent(in) :: thick, elem(3, nn), shell_disp(6, nn)
482 logical,
intent(in) :: finite_rotation_director, use_director_tangent, need_second_tangent
483 real(kind=kreal),
intent(in),
optional :: ndtriad(9, nn), ndreftriad(9, nn), ndcurtriad(9, nn)
484 real(kind=kreal),
intent(out) :: v1(3, nn), v2(3, nn), v3(3, nn)
485 real(kind=kreal),
intent(out) :: a_over_2_v3(3, nn), a_over_2_v3_ref(3, nn)
486 real(kind=kreal),
intent(out) :: a_over_2_v3_deriv(3, 3, nn), a_over_2_v3_second(3, 3, 3, nn)
489 real(kind=kreal) :: director_ref(3), rotmat(3, 3)
490 real(kind=kreal) :: nddirector(3, nn), ndrefdirector(3, nn), ndcurdirector(3, nn)
491 logical :: has_nddirector, has_ndrefdirector, has_ndcurdirector
493 has_nddirector =
present(ndtriad)
494 has_ndrefdirector =
present(ndreftriad)
495 has_ndcurdirector =
present(ndcurtriad)
496 if (has_nddirector) nddirector(1:3, 1:nn) = 0.5d0*thick*ndtriad(7:9, 1:nn)
497 if (has_ndrefdirector) ndrefdirector(1:3, 1:nn) = 0.5d0*thick*ndreftriad(7:9, 1:nn)
498 if (has_ndcurdirector) ndcurdirector(1:3, 1:nn) = 0.5d0*thick*ndcurtriad(7:9, 1:nn)
500 a_over_2_v3_deriv = 0.0d0
501 a_over_2_v3_second = 0.0d0
505 a_over_2_v3_ref(:, nb) = a_over_2_v3(:, nb)
506 if (finite_rotation_director .and. flag ==
updatelag .and. has_ndcurdirector)
then
507 a_over_2_v3_ref(:, nb) = ndcurdirector(:, nb)
508 else if (finite_rotation_director .and. has_ndrefdirector)
then
509 a_over_2_v3_ref(:, nb) = ndrefdirector(:, nb)
512 director_ref = a_over_2_v3_ref(:, nb)
513 if (finite_rotation_director)
then
514 if (has_nddirector)
then
515 a_over_2_v3(:, nb) = nddirector(:, nb)
518 a_over_2_v3(:, nb) = matmul(rotmat, director_ref)
520 if (use_director_tangent)
then
523 if( need_second_tangent )
then
524 call shelldirectorincrementalsecondderiv(a_over_2_v3(:, nb), a_over_2_v3_second(:, :, :, nb))
529 if (.not. use_director_tangent)
then
533 end subroutine shellmitc_setupnodaldirectors
539 zeta_tying, elem, shell_disp, director, director_tangent, use_green_lagrange, &
540 use_director_tangent, point_B, point_basis_variation, director_second_tangent, point_director_second_variation)
543 integer(kind=kint),
intent(in) :: etype, nn, ndof, tying_set, tying_point
544 real(kind=kreal),
intent(in) :: zeta_tying
545 real(kind=kreal),
intent(in) :: elem(3, nn), shell_disp(6, nn), director(3, nn)
546 real(kind=kreal),
intent(in) :: director_tangent(3, 3, nn)
547 logical,
intent(in) :: use_green_lagrange, use_director_tangent
548 real(kind=kreal),
intent(out) :: point_b(5, ndof*nn)
549 real(kind=kreal),
intent(out) :: point_basis_variation(3, ndof*nn, 3)
550 real(kind=kreal),
intent(in),
optional :: director_second_tangent(3, 3, 3, nn)
551 real(kind=kreal),
intent(out),
optional :: point_director_second_variation(5, 3, 3, nn)
553 real(kind=kreal) :: naturalcoord(2), shapefunc(nn), shapederiv(nn, 2)
554 real(kind=kreal) :: director_contribution(3, nn, 3)
555 real(kind=kreal) :: kinematic_basis(3, 3), membrane_basis(3, 2)
556 real(kind=kreal) :: translation_gradient(3, 2)
558 call gettyingpoint(etype, tying_set, tying_point, naturalcoord)
562 call shellmitc_directorcontributions(nn, director, zeta_tying, shapefunc, shapederiv, director_contribution)
564 if( abs(shellmitc_covariantjacobian(kinematic_basis)) <= tiny(1.0d0) ) &
565 stop
"Invalid shell Jacobian"
567 membrane_basis = kinematic_basis(:, shell_xi:shell_eta)
568 if( use_green_lagrange )
then
569 translation_gradient = matmul(shell_disp(1:3, :), shapederiv)
571 membrane_basis = membrane_basis+translation_gradient
573 kinematic_basis(:, shell_xi:shell_eta) = kinematic_basis(:, shell_xi:shell_eta)+translation_gradient
574 membrane_basis = kinematic_basis(:, shell_xi:shell_eta)
578 call shellmitc_buildfirststrainvariation(nn, ndof, zeta_tying, shapefunc, shapederiv, &
579 kinematic_basis, membrane_basis, director_contribution, director_tangent, &
580 use_director_tangent, point_b, point_basis_variation)
582 if( use_director_tangent .and.
present(director_second_tangent) .and.
present(point_director_second_variation) )
then
583 call shellmitc_builddirectorsecondvariation(nn, zeta_tying, shapefunc, shapederiv, &
584 kinematic_basis, director_second_tangent, point_director_second_variation)
590 subroutine shellmitc_evaluatetyingbatzeta(etype, nn, ndof, zeta_tying, elem, shell_disp, &
591 director, director_tangent, use_green_lagrange, use_director_tangent, tying_B)
594 integer(kind=kint),
intent(in) :: etype, nn, ndof
595 real(kind=kreal),
intent(in) :: zeta_tying
596 real(kind=kreal),
intent(in) :: elem(3, nn), shell_disp(6, nn), director(3, nn)
597 real(kind=kreal),
intent(in) :: director_tangent(3, 3, nn)
598 logical,
intent(in) :: use_green_lagrange, use_director_tangent
599 real(kind=kreal),
intent(out) :: tying_b(5, ndof*nn, 6, 3)
601 integer :: tying_set, tying_point
602 real(kind=kreal) :: point_b(5, ndof*nn)
603 real(kind=kreal) :: point_basis_variation(3, ndof*nn, 3)
609 zeta_tying, elem, shell_disp, director, director_tangent, use_green_lagrange, &
610 use_director_tangent, point_b, point_basis_variation)
611 tying_b(:, :, tying_point, tying_set) = point_b
614 end subroutine shellmitc_evaluatetyingbatzeta
618 subroutine shellmitc_evaluatetyingstiffnessdataatzeta(etype, nn, ndof, zeta_tying, &
619 elem, shell_disp, director, director_tangent, director_second_tangent, &
620 use_green_lagrange, use_director_tangent, tying_B, tying_basis_variation, tying_director_second_variation)
623 integer(kind=kint),
intent(in) :: etype, nn, ndof
624 real(kind=kreal),
intent(in) :: zeta_tying
625 real(kind=kreal),
intent(in) :: elem(3, nn), shell_disp(6, nn), director(3, nn)
626 real(kind=kreal),
intent(in) :: director_tangent(3, 3, nn)
627 real(kind=kreal),
intent(in) :: director_second_tangent(3, 3, 3, nn)
628 logical,
intent(in) :: use_green_lagrange, use_director_tangent
629 real(kind=kreal),
intent(out) :: tying_b(5, ndof*nn, 6, 3)
630 real(kind=kreal),
intent(out) :: tying_basis_variation(3, ndof*nn, 3, 6, 3)
631 real(kind=kreal),
intent(out) :: tying_director_second_variation(5, 3, 3, nn, 6, 3)
633 integer :: tying_set, tying_point
634 real(kind=kreal) :: point_b(5, ndof*nn)
635 real(kind=kreal) :: point_basis_variation(3, ndof*nn, 3)
636 real(kind=kreal) :: point_director_second_variation(5, 3, 3, nn)
639 tying_basis_variation = 0.0d0
640 tying_director_second_variation = 0.0d0
644 if( use_director_tangent )
then
646 zeta_tying, elem, shell_disp, director, director_tangent, use_green_lagrange, &
647 use_director_tangent, point_b, point_basis_variation, director_second_tangent, point_director_second_variation)
648 tying_director_second_variation(:, :, :, :, tying_point, tying_set) = point_director_second_variation
651 zeta_tying, elem, shell_disp, director, director_tangent, use_green_lagrange, &
652 use_director_tangent, point_b, point_basis_variation)
654 tying_b(:, :, tying_point, tying_set) = point_b
655 tying_basis_variation(:, :, :, tying_point, tying_set) = point_basis_variation
658 end subroutine shellmitc_evaluatetyingstiffnessdataatzeta
662 subroutine shellmitc_buildfirststrainvariation(nn, ndof, zeta, shapefunc, shapederiv, &
663 kinematic_basis, membrane_basis, director_contribution, director_tangent, &
664 use_director_tangent, strain_variation, basis_variation)
667 integer(kind=kint),
intent(in) :: nn, ndof
668 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), shapederiv(nn, 2)
669 real(kind=kreal),
intent(in) :: kinematic_basis(3, 3), membrane_basis(3, 2)
670 real(kind=kreal),
intent(in) :: director_contribution(3, nn, 3)
671 real(kind=kreal),
intent(in) :: director_tangent(3, 3, nn)
672 logical,
intent(in) :: use_director_tangent
673 real(kind=kreal),
intent(out) :: strain_variation(5, ndof*nn)
674 real(kind=kreal),
intent(out) :: basis_variation(3, ndof*nn, 3)
676 integer :: node, component, dof_index, rotation_start
678 basis_variation = 0.0d0
680 do component = 1, min(3, ndof)
681 dof_index = ndof*(node-1)+component
682 basis_variation(component, dof_index, shell_xi:shell_eta) = shapederiv(node, :)
686 rotation_start = ndof*(node-1)+4
687 if( use_director_tangent )
then
688 basis_variation(:, rotation_start:rotation_start+2, shell_xi) = &
689 shapederiv(node, shell_xi)*zeta*director_tangent(:, :, node)
690 basis_variation(:, rotation_start:rotation_start+2, shell_eta) = &
691 shapederiv(node, shell_eta)*zeta*director_tangent(:, :, node)
692 basis_variation(:, rotation_start:rotation_start+2, shell_zeta) = shapefunc(node)*director_tangent(:, :, node)
695 basis_variation(:, rotation_start:rotation_start+2, shell_xi) = &
697 basis_variation(:, rotation_start:rotation_start+2, shell_eta) = &
699 basis_variation(:, rotation_start:rotation_start+2, shell_zeta) = &
704 do dof_index = 1, ndof*nn
705 strain_variation(:, dof_index) = shellmitc_symmetriccomponents( &
706 matmul(transpose(basis_variation(:, dof_index, :)), kinematic_basis))
712 do component = 1, min(3, ndof)
713 dof_index = ndof*(node-1)+component
714 strain_variation(1, dof_index) = shapederiv(node, shell_xi)*membrane_basis(component, shell_xi)
715 strain_variation(2, dof_index) = shapederiv(node, shell_eta)*membrane_basis(component, shell_eta)
716 strain_variation(3, dof_index) = shapederiv(node, shell_xi)*membrane_basis(component, shell_eta) &
717 +shapederiv(node, shell_eta)*membrane_basis(component, shell_xi)
720 end subroutine shellmitc_buildfirststrainvariation
724 subroutine shellmitc_builddirectorsecondvariation(nn, zeta, shapefunc, shapederiv, &
725 kinematic_basis, director_second_tangent, director_second_variation)
728 integer(kind=kint),
intent(in) :: nn
729 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), shapederiv(nn, 2)
730 real(kind=kreal),
intent(in) :: kinematic_basis(3, 3)
731 real(kind=kreal),
intent(in) :: director_second_tangent(3, 3, 3, nn)
732 real(kind=kreal),
intent(out) :: director_second_variation(5, 3, 3, nn)
734 integer :: node, m, n
735 real(kind=kreal) :: second_basis(3, 3)
737 director_second_variation = 0.0d0
741 second_basis(:, shell_xi) = zeta*shapederiv(node, shell_xi) *director_second_tangent(:, m, n, node)
742 second_basis(:, shell_eta) = zeta*shapederiv(node, shell_eta) *director_second_tangent(:, m, n, node)
743 second_basis(:, shell_zeta) = shapefunc(node) *director_second_tangent(:, m, n, node)
744 director_second_variation(:, m, n, node) = shellmitc_symmetriccomponents( &
745 matmul(transpose(second_basis), kinematic_basis))
749 end subroutine shellmitc_builddirectorsecondvariation
754 subroutine shellmitc_evaluatetyingoperator(etype, xi, eta, nterms, target_component, &
755 source_component, tying_point, tying_group, coefficient, replaced_component)
758 integer(kind=kint),
intent(in) :: etype
759 real(kind=kreal),
intent(in) :: xi, eta
760 integer,
intent(out) :: nterms
761 integer,
intent(out) :: target_component(max_tying_terms), source_component(MAX_TYING_TERMS)
762 integer,
intent(out) :: tying_point(MAX_TYING_TERMS), tying_group(MAX_TYING_TERMS)
763 real(kind=kreal),
intent(out) :: coefficient(max_tying_terms)
764 logical,
intent(out) :: replaced_component(5)
767 real(kind=kreal) :: xxi, eeta, h
773 target_component(1:4) = (/ 4, 4, 5, 5 /)
774 source_component(1:4) = (/ 4, 4, 5, 5 /)
775 tying_point(1:4) = (/ 4, 2, 1, 3 /)
776 tying_group(1:4) = (/ 1, 1, 1, 1 /)
777 coefficient(1:4) = (/ 0.5d0*( 1.0d0-xi ), 0.5d0*( 1.0d0+xi ), 0.5d0*( 1.0d0-eta ), 0.5d0*( 1.0d0+eta ) /)
780 xxi = xi /dsqrt( 1.0d0/3.0d0 )
781 eeta = eta/dsqrt( 3.0d0/5.0d0 )
786 target_component(nterms+1:nterms+2) = (/ 1, 5 /)
787 source_component(nterms+1:nterms+2) = (/ 1, 5 /)
788 tying_point(nterms+1:nterms+2) = ip
789 tying_group(nterms+1:nterms+2) = 1
790 coefficient(nterms+1:nterms+2) = h
794 xxi = xi /dsqrt( 3.0d0/5.0d0 )
795 eeta = eta/dsqrt( 1.0d0/3.0d0 )
800 target_component(nterms+1:nterms+2) = (/ 2, 4 /)
801 source_component(nterms+1:nterms+2) = (/ 2, 4 /)
802 tying_point(nterms+1:nterms+2) = ip
803 tying_group(nterms+1:nterms+2) = 2
804 coefficient(nterms+1:nterms+2) = h
808 xxi = xi /dsqrt( 1.0d0/3.0d0 )
809 eeta = eta/dsqrt( 1.0d0/3.0d0 )
813 target_component(nterms) = 3
814 source_component(nterms) = 3
815 tying_point(nterms) = ip
816 tying_group(nterms) = 3
817 coefficient(nterms) = h
822 target_component(1:8) = (/ 4, 4, 4, 4, 5, 5, 5, 5 /)
823 source_component(1:8) = (/ 4, 5, 4, 5, 4, 5, 4, 5 /)
824 tying_point(1:8) = (/ 2, 1, 3, 3, 2, 1, 3, 3 /)
825 tying_group(1:8) = (/ 1, 1, 1, 1, 1, 1, 1, 1 /)
826 coefficient(1:8) = (/ 1.0d0-xi, xi, xi, -xi, eta, 1.0d0-eta, -eta, eta /)
829 replaced_component(:) = .false.
831 replaced_component(target_component(k)) = .true.
834 end subroutine shellmitc_evaluatetyingoperator
838 subroutine shellmitc_applyassumedstrain(etype, nn, ndof, xi_lx, eta_lx, tying_B, B, &
839 tying_director_second_variation, B2rot)
842 integer(kind=kint),
intent(in) :: etype, nn, ndof
843 real(kind=kreal),
intent(in) :: xi_lx, eta_lx
844 real(kind=kreal),
intent(in) :: tying_b(5, ndof*nn, 6, 3)
845 real(kind=kreal),
intent(inout) :: b(5, ndof*nn)
846 real(kind=kreal),
intent(in),
optional :: tying_director_second_variation(5, 3, 3, nn, 6, 3)
847 real(kind=kreal),
intent(inout),
optional :: b2rot(:, :, :, :)
849 integer :: k, c, jsize, m, n, nb, nterms
850 integer :: target_component(MAX_TYING_TERMS), source_component(MAX_TYING_TERMS)
851 integer :: tying_point(MAX_TYING_TERMS), tying_group(MAX_TYING_TERMS)
852 real(kind=kreal) :: coefficient(max_tying_terms)
853 logical :: replaced_component(5)
855 call shellmitc_evaluatetyingoperator(etype, xi_lx, eta_lx, nterms, target_component, &
856 source_component, tying_point, tying_group, coefficient, replaced_component)
857 if( nterms == 0 )
return
860 if( replaced_component(c) ) b(c, 1:ndof*nn) = 0.0d0
863 do jsize = 1, ndof*nn
864 b(target_component(k), jsize) = b(target_component(k), jsize) &
865 +coefficient(k)*tying_b(source_component(k), jsize, tying_point(k), tying_group(k))
869 if(
present(tying_director_second_variation) .and.
present(b2rot) )
then
871 if( replaced_component(c) ) b2rot(c, :, :, :) = 0.0d0
877 b2rot(target_component(k), m, n, nb) = b2rot(target_component(k), m, n, nb) &
878 +coefficient(k)*tying_director_second_variation(source_component(k), m, n, nb, &
879 tying_point(k), tying_group(k))
886 end subroutine shellmitc_applyassumedstrain
890 pure real(kind=kreal) function shellmitc_strainsecondvariationpair(component, basis_variation_i, basis_variation_j)
893 integer,
intent(in) :: component
894 real(kind=kreal),
intent(in) :: basis_variation_i(3, 3), basis_variation_j(3, 3)
896 select case( component )
898 shellmitc_strainsecondvariationpair = dot_product( basis_variation_i(:, shell_xi), basis_variation_j(:, shell_xi))
900 shellmitc_strainsecondvariationpair = dot_product( basis_variation_i(:, shell_eta), basis_variation_j(:, shell_eta))
902 shellmitc_strainsecondvariationpair = dot_product( &
903 basis_variation_i(:, shell_xi), basis_variation_j(:, shell_eta)) &
904 +dot_product(basis_variation_i(:, shell_eta), basis_variation_j(:, shell_xi))
906 shellmitc_strainsecondvariationpair = dot_product( &
907 basis_variation_i(:, shell_eta), basis_variation_j(:, shell_zeta)) &
908 +dot_product(basis_variation_i(:, shell_zeta), basis_variation_j(:, shell_eta))
910 shellmitc_strainsecondvariationpair = dot_product( &
911 basis_variation_i(:, shell_zeta), basis_variation_j(:, shell_xi)) &
912 +dot_product(basis_variation_i(:, shell_xi), basis_variation_j(:, shell_zeta))
914 shellmitc_strainsecondvariationpair = 0.0d0
917 end function shellmitc_strainsecondvariationpair
921 subroutine shellmitc_addgeometricstiffness(etype, nn, ndof, kinematics, &
922 use_director_tangent, use_green_lagrange, add_geometric_stiffness, &
923 xi, eta, integration_weight, layer_weight, stress, B, basis_variation, &
924 tying_basis_variation, reciprocal_basis, material_local_basis, material_reciprocal_basis, B2rot, director, stiff)
928 integer(kind=kint),
intent(in) :: etype, nn, ndof, kinematics
929 logical,
intent(in) :: use_director_tangent, use_green_lagrange
930 logical,
intent(in) :: add_geometric_stiffness
931 real(kind=kreal),
intent(in) :: xi, eta, integration_weight, layer_weight
932 real(kind=kreal),
intent(in) :: stress(5), b(5, ndof*nn)
933 real(kind=kreal),
intent(in) :: basis_variation(3, ndof*nn, 3)
934 real(kind=kreal),
intent(in) :: tying_basis_variation(3, ndof*nn, 3, 6, 3)
935 real(kind=kreal),
intent(in) :: reciprocal_basis(3, 3)
936 real(kind=kreal),
intent(in) :: material_local_basis(3, 3)
937 real(kind=kreal),
intent(in) :: material_reciprocal_basis(3, 3)
938 real(kind=kreal),
intent(in) :: b2rot(5, 3, 3, nn)
939 real(kind=kreal),
intent(in) :: director(3, nn)
940 real(kind=kreal),
intent(inout) :: stiff(ndof*nn, ndof*nn)
942 integer :: isize, jsize, k, c, ip, it, nterms
943 integer :: target_component(MAX_TYING_TERMS), source_component(MAX_TYING_TERMS)
944 integer :: tying_point(MAX_TYING_TERMS), tying_group(MAX_TYING_TERMS)
945 real(kind=kreal) :: coefficient(max_tying_terms)
946 logical :: replaced_component(5)
947 real(kind=kreal) :: qf_stress_integrand(ndof*nn), vol_deriv(ndof*nn)
948 real(kind=kreal) :: geo_term, local_stress(3, 3), s_global(3, 3)
949 real(kind=kreal) :: basis_gradient(3, 3, ndof*nn)
950 real(kind=kreal) :: stress_basis_gradient(3, 3, ndof*nn)
953 do jsize = 1, ndof*nn
954 vol_deriv(jsize) = sum(reciprocal_basis*basis_variation(:, jsize, :))
955 qf_stress_integrand(jsize) = dot_product(stress, b(:, jsize))
959 if( add_geometric_stiffness )
then
960 if( use_green_lagrange .or. kinematics ==
updatelag )
then
961 call shellmitc_evaluatetyingoperator(etype, xi, eta, nterms, target_component, &
962 source_component, tying_point, tying_group, coefficient, replaced_component)
963 do jsize = 1, ndof*nn
964 do isize = 1, ndof*nn
967 if( replaced_component(c) ) cycle
968 geo_term = geo_term+stress(c)*shellmitc_strainsecondvariationpair(c, &
969 basis_variation(:, isize, :), basis_variation(:, jsize, :))
974 geo_term = geo_term+stress(target_component(k))*coefficient(k) &
975 *shellmitc_strainsecondvariationpair(source_component(k), tying_basis_variation(:, isize, :, ip, it), &
976 tying_basis_variation(:, jsize, :, ip, it))
978 stiff(isize, jsize) = stiff(isize, jsize) +integration_weight*layer_weight*geo_term
982 local_stress = reshape((/ stress(1), stress(3), stress(5), &
983 stress(3), stress(2), stress(4), stress(5), stress(4), 0.0d0 /), (/ 3, 3 /))
984 s_global = matmul(material_local_basis, matmul(local_stress, transpose(material_local_basis)))
986 do jsize = 1, ndof*nn
987 basis_gradient(:, :, jsize) = matmul(basis_variation(:, jsize, :), transpose(material_reciprocal_basis))
988 stress_basis_gradient(:, :, jsize) = matmul(basis_gradient(:, :, jsize), s_global)
990 do jsize = 1, ndof*nn
991 do isize = 1, ndof*nn
992 stiff(isize, jsize) = stiff(isize, jsize) +integration_weight*layer_weight*sum( &
993 basis_gradient(:, :, isize)*stress_basis_gradient(:, :, jsize))
998 do jsize = 1, ndof*nn
999 do isize = 1, ndof*nn
1000 stiff(isize, jsize) = stiff(isize, jsize) &
1001 +integration_weight*layer_weight*qf_stress_integrand(isize)*vol_deriv(jsize)
1005 if( use_director_tangent .and. (use_green_lagrange .or. kinematics ==
updatelag) )
then
1006 call shellmitc_adddirectorstressstiffness(nn, ndof, integration_weight, layer_weight, &
1007 stress, b2rot, director, stiff)
1011 end subroutine shellmitc_addgeometricstiffness
1016 director_second_tangent, reciprocal_basis, local_basis, use_director_tangent, drilling_second_variation)
1019 integer(kind=kint),
intent(in) :: nn
1020 real(kind=kreal),
intent(in) :: zeta, shapefunc(nn), shapederiv(nn, 2)
1021 real(kind=kreal),
intent(in) :: director_second_tangent(3, 3, 3, nn)
1022 real(kind=kreal),
intent(in) :: reciprocal_basis(3, 3), local_basis(3, 3)
1023 logical,
intent(in) :: use_director_tangent
1024 real(kind=kreal),
intent(out) :: drilling_second_variation(3, 3, nn)
1026 integer :: node, m, n
1027 real(kind=kreal) :: second_basis(3, 3), skew_gradient(3, 3)
1029 drilling_second_variation = 0.0d0
1030 if( .not. use_director_tangent )
return
1034 second_basis(:, shell_xi) = shapederiv(node, shell_xi)*zeta*director_second_tangent(:, m, n, node)
1035 second_basis(:, shell_eta) = shapederiv(node, shell_eta)*zeta*director_second_tangent(:, m, n, node)
1036 second_basis(:, shell_zeta) = shapefunc(node)*director_second_tangent(:, m, n, node)
1037 skew_gradient = matmul(reciprocal_basis, transpose(second_basis))
1038 skew_gradient = skew_gradient-transpose(skew_gradient)
1039 drilling_second_variation(m, n, node) = dot_product( local_basis(:, shell_xi), &
1040 matmul(skew_gradient, local_basis(:, shell_eta)))
1049 subroutine shellmitc_builddrillingvector(nn, ndof, finite_rotation_director, shapefunc, &
1050 point_triad, reciprocal_basis, basis_variation, displacement, director, nddrill, Cv, Cv_disp)
1053 integer(kind=kint),
intent(in) :: nn, ndof
1054 logical,
intent(in) :: finite_rotation_director
1055 real(kind=kreal),
intent(in) :: shapefunc(nn), point_triad(3, 3)
1056 real(kind=kreal),
intent(in) :: reciprocal_basis(3, 3)
1057 real(kind=kreal),
intent(in) :: basis_variation(3, ndof*nn, 3)
1058 real(kind=kreal),
intent(in) :: displacement(ndof*nn), director(3, nn)
1059 real(kind=kreal),
intent(in),
optional :: nddrill(nn)
1060 real(kind=kreal),
intent(out) :: cv(ndof*nn), cv_disp
1062 integer :: j, nb, jrot
1063 real(kind=kreal) :: cv_w(ndof*nn), cv_theta(ndof*nn)
1064 real(kind=kreal) :: cmat(3, 3), drill_axis(3), axis_norm
1067 cmat = matmul(reciprocal_basis, transpose(basis_variation(:, j, :)))
1068 cmat = cmat-transpose(cmat)
1069 cv_w(j) = dot_product(point_triad(:, shell_xi), matmul(cmat, point_triad(:, shell_eta)))
1073 if( ndof >= 6 )
then
1075 jrot = ndof*(nb-1)+4
1076 drill_axis = point_triad(:, shell_zeta)
1077 if( finite_rotation_director .and.
present(nddrill) )
then
1078 drill_axis = director(:, nb)
1079 axis_norm = sqrt(dot_product(drill_axis, drill_axis))
1080 if( axis_norm > 0.0d0 )
then
1081 drill_axis = drill_axis/axis_norm
1083 drill_axis = point_triad(:, shell_zeta)
1086 cv_theta(jrot:jrot+2) = shapefunc(nb)*drill_axis
1090 cv = cv_theta-0.5d0*cv_w
1091 cv_disp = dot_product(cv, displacement)
1092 if( finite_rotation_director .and.
present(nddrill) )
then
1093 cv_disp = -0.5d0*dot_product(cv_w, displacement)+dot_product(shapefunc, nddrill)
1095 end subroutine shellmitc_builddrillingvector
1099 subroutine shellmitc_adddrillingstiffness(nn, ndof, finite_rotation_director, &
1100 use_director_tangent, shapefunc, Cv, Cv_disp, Cv_w_second, displacement, &
1101 director, director_deriv, alpha, integration_weight, layer_weight, nddrill, stiff)
1104 integer(kind=kint),
intent(in) :: nn, ndof
1105 logical,
intent(in) :: finite_rotation_director, use_director_tangent
1106 real(kind=kreal),
intent(in) :: shapefunc(nn), cv(ndof*nn), cv_disp
1107 real(kind=kreal),
intent(in) :: cv_w_second(3, 3, nn), displacement(ndof*nn)
1108 real(kind=kreal),
intent(in) :: director(3, nn), director_deriv(3, 3, nn)
1109 real(kind=kreal),
intent(in) :: alpha, integration_weight, layer_weight
1110 real(kind=kreal),
intent(in),
optional :: nddrill(nn)
1111 real(kind=kreal),
intent(inout) :: stiff(ndof*nn, ndof*nn)
1113 integer :: isize, jsize, nb, m, n
1114 real(kind=kreal) :: scale, cv_deriv, cv_deriv_disp
1115 real(kind=kreal) :: drill_axis(3), drill_coeff, axis_norm
1117 scale = integration_weight*layer_weight*alpha
1118 do jsize = 1, ndof*nn
1119 do isize = 1, ndof*nn
1120 stiff(isize, jsize) = stiff(isize, jsize)+scale*cv(isize)*cv(jsize)
1123 if( .not. use_director_tangent )
return
1127 jsize = ndof*(nb-1)+3+n
1128 cv_deriv_disp = 0.0d0
1130 isize = ndof*(nb-1)+3+m
1131 cv_deriv = -0.5d0*cv_w_second(m, n, nb)
1132 if( finite_rotation_director .and.
present(nddrill) )
then
1133 drill_axis = director(:, nb)
1134 axis_norm = sqrt(dot_product(drill_axis, drill_axis))
1135 if( axis_norm > 0.0d0 )
then
1136 drill_axis = drill_axis/axis_norm
1137 drill_coeff = dot_product(drill_axis, director_deriv(:, n, nb))
1138 cv_deriv = cv_deriv+shapefunc(nb) *(director_deriv(m, n, nb)-drill_axis(m)*drill_coeff)/axis_norm
1141 cv_deriv_disp = cv_deriv_disp+cv_deriv*displacement(isize)
1142 stiff(isize, jsize) = stiff(isize, jsize)+scale*cv_deriv*cv_disp
1144 stiff(:, jsize) = stiff(:, jsize)+scale*cv*cv_deriv_disp
1147 end subroutine shellmitc_adddrillingstiffness
1151 subroutine shellmitc_adddirectorstressstiffness(nn, ndof, w_w_w_det, layer_weight, Sv_force, B2rot, a_over_2_v3, stiff)
1154 integer(kind=kint),
intent(in) :: nn, ndof
1155 real(kind=kreal),
intent(in) :: w_w_w_det, layer_weight, sv_force(5)
1156 real(kind=kreal),
intent(in) :: b2rot(5, 3, 3, nn), a_over_2_v3(3, nn)
1157 real(kind=kreal),
intent(inout) :: stiff(ndof*nn, ndof*nn)
1159 integer :: i, j, m, n, nb, isize, jsize
1160 real(kind=kreal) :: drill_axis(3), rot_projector(3, 3), hrot(3, 3)
1161 real(kind=kreal) :: hess_coeff, drill_coeff, axis_norm
1164 drill_axis(1:3) = a_over_2_v3(1:3, nb)
1165 axis_norm = sqrt(sum(drill_axis(1:3)*drill_axis(1:3)))
1166 if( axis_norm > 0.0d0 )
then
1167 drill_axis(1:3) = drill_axis(1:3)/axis_norm
1169 drill_axis(1:3) = (/ 0.0d0, 0.0d0, 1.0d0 /)
1171 rot_projector(:, :) = 0.0d0
1173 rot_projector(i, i) = 1.0d0
1177 rot_projector(i, j) = rot_projector(i, j)-drill_axis(i)*drill_axis(j)
1182 hrot(m, n) = dot_product(sv_force(1:5), b2rot(1:5, m, n, nb))
1186 jsize = ndof*(nb-1)+3+n
1188 isize = ndof*(nb-1)+3+m
1192 hess_coeff = hess_coeff +rot_projector(i, m)*hrot(i, j)*rot_projector(j, n)
1197 drill_coeff = drill_coeff+drill_axis(i)*hrot(i, n)
1201 drill_coeff = drill_coeff +rot_projector(i, n)*hrot(i, j)*drill_axis(j)
1204 stiff(isize, jsize) = stiff(isize, jsize) +w_w_w_det*layer_weight *(hess_coeff+drill_axis(m)*drill_coeff)
1209 end subroutine shellmitc_adddirectorstressstiffness
1213 subroutine shellmixeddofmap(mixflag, nn, ndof, sstable, is_mixed)
1216 integer(kind=kint),
intent(in) :: mixflag, nn, ndof
1217 integer,
intent(out) :: sstable(ndof*nn)
1218 logical,
intent(out) :: is_mixed
1223 if( mixflag == 1 .and. ndof*nn == 24 )
then
1224 sstable = (/ 1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21, 4, 5, 6, 10, 11, 12, 16, 17, 18, 22, 23, 24 /)
1225 else if( mixflag == 2 .and. ndof*nn == 18 )
then
1226 sstable = (/ 1, 2, 3, 7, 8, 9, 13, 14, 15, 4, 5, 6, 10, 11, 12, 16, 17, 18 /)
1229 sstable = [(i, i=1, ndof*nn)]
1231 end subroutine shellmixeddofmap
1235 subroutine shellapplymixeddofordering(mixflag, nn, ndof, stiff, qf)
1238 integer(kind=kint),
intent(in) :: mixflag, nn, ndof
1239 real(kind=kreal),
intent(inout),
optional :: stiff(ndof*nn, ndof*nn), qf(ndof*nn)
1241 integer :: i, j, sstable(ndof*nn)
1242 real(kind=kreal) :: stiff_work(ndof*nn, ndof*nn), qf_work(ndof*nn)
1245 call shellmixeddofmap(mixflag, nn, ndof, sstable, is_mixed)
1246 if( .not. is_mixed )
return
1248 if(
present(stiff) )
then
1252 stiff(i, j) = stiff_work(sstable(i), sstable(j))
1256 if(
present(qf) )
then
1259 qf(i) = qf_work(sstable(i))
1262 end subroutine shellapplymixeddofordering
1266 subroutine shellmitc_evaluatetyingstrains(etype, nn, zeta, elem, edisp, director, &
1267 director_increment, use_green_lagrange, tying_strain)
1270 integer(kind=kint),
intent(in) :: etype, nn
1271 real(kind=kreal),
intent(in) :: zeta
1272 real(kind=kreal),
intent(in) :: elem(3, nn), edisp(6, nn)
1273 real(kind=kreal),
intent(in) :: director(3, nn), director_increment(3, nn)
1274 logical,
intent(in) :: use_green_lagrange
1275 real(kind=kreal),
intent(out) :: tying_strain(5, 6, 3)
1277 integer :: tying_set, tying_point
1278 real(kind=kreal) :: tying_zeta, naturalcoord(2)
1279 real(kind=kreal) :: shapefunc(nn), shapederiv(nn, 2)
1280 real(kind=kreal) :: covariant_basis(3, 3), reference_basis(3, 3), current_basis(3, 3)
1281 real(kind=kreal) :: reference_jacobian, current_jacobian, point_strain(5)
1283 tying_strain = 0.0d0
1284 tying_zeta = shellmitc_tyingzeta(etype, zeta)
1288 call gettyingpoint(etype, tying_set, tying_point, naturalcoord)
1292 if( abs(shellmitc_covariantjacobian(covariant_basis)) <= tiny(1.0d0) ) &
1293 stop
"Invalid shell Jacobian"
1294 call shellmitc_evaluatepointstrain(nn, tying_zeta, shapefunc, shapederiv, &
1295 edisp(1:3, :), director_increment, covariant_basis, use_green_lagrange, &
1296 point_strain, reference_basis, current_basis, reference_jacobian, current_jacobian)
1297 tying_strain(:, tying_point, tying_set) = point_strain
1301 end subroutine shellmitc_evaluatetyingstrains
1308 subroutine shellmitc_setupstresskinematics(nn, ecoord, kinematics, finite_rotation, edisp, &
1309 nddirector, ndrefdirector, nddirector_deriv, ndbase_disp, elem, director, director_increment)
1313 integer(kind=kint),
intent(in) :: nn, kinematics
1314 logical,
intent(in) :: finite_rotation
1315 real(kind=kreal),
intent(in) :: ecoord(3, nn), edisp(6, nn)
1316 real(kind=kreal),
intent(in) :: nddirector(3, nn), ndrefdirector(3, nn)
1317 real(kind=kreal),
intent(in) :: nddirector_deriv(3, 3, nn)
1318 real(kind=kreal),
intent(in),
optional :: ndbase_disp(6, nn)
1319 real(kind=kreal),
intent(out) :: elem(3, nn)
1320 real(kind=kreal),
intent(out) :: director(3, nn), director_increment(3, nn)
1325 if( kinematics ==
updatelag .and.
present(ndbase_disp) )
then
1326 elem = elem+ndbase_disp(1:3, :)
1328 if( kinematics ==
updatelag ) elem = elem+0.5d0*edisp(1:3, :)
1331 director(:, na) = nddirector(:, na)
1332 director_increment(:, na) = director(:, na)-ndrefdirector(:, na)
1333 if( .not. finite_rotation )
then
1334 director_increment(:, na) = matmul(nddirector_deriv(:, :, na), edisp(4:6, na))
1336 director(:, na) = ndrefdirector(:, na)+0.5d0*director_increment(:, na)
1339 end subroutine shellmitc_setupstresskinematics
1344 director, director_increment, use_green_lagrange, tying_strain, dstrain, &
1345 strain_tensor, covariant_basis, reciprocal_basis, material_local_basis, &
1346 material_reciprocal_basis, reference_basis, current_basis, reference_jacobian, current_jacobian)
1349 integer(kind=kint),
intent(in) :: etype, nn
1350 real(kind=kreal),
intent(in) :: naturalcoord(2), zeta
1351 real(kind=kreal),
intent(in) :: elem(3, nn), edisp(6, nn)
1352 real(kind=kreal),
intent(in) :: director(3, nn), director_increment(3, nn)
1353 logical,
intent(in) :: use_green_lagrange
1354 real(kind=kreal),
intent(in) :: tying_strain(5, 6, 3)
1355 real(kind=kreal),
intent(out) :: dstrain(6), strain_tensor(3, 3)
1356 real(kind=kreal),
intent(out) :: covariant_basis(3, 3), reciprocal_basis(3, 3)
1357 real(kind=kreal),
intent(out) :: material_local_basis(3, 3)
1358 real(kind=kreal),
intent(out) :: material_reciprocal_basis(3, 3)
1359 real(kind=kreal),
intent(out) :: reference_basis(3, 3), current_basis(3, 3)
1360 real(kind=kreal),
intent(out) :: reference_jacobian, current_jacobian
1362 integer :: k, c, nterms
1363 integer :: target_component(MAX_TYING_TERMS), source_component(MAX_TYING_TERMS)
1364 integer :: tying_point(MAX_TYING_TERMS), tying_group(MAX_TYING_TERMS)
1365 real(kind=kreal) :: coefficient(max_tying_terms)
1366 logical :: replaced_component(5)
1367 real(kind=kreal) :: shapefunc(nn), shapederiv(nn, 2), strain(5)
1368 real(kind=kreal) :: local_basis(3, 3), jacobian, material_jacobian
1373 if( abs(shellmitc_covariantjacobian(covariant_basis)) <= tiny(1.0d0) ) &
1374 stop
"Invalid shell Jacobian"
1375 call shellmitc_basisfromcovariant(covariant_basis, local_basis, reciprocal_basis, jacobian)
1376 call shellmitc_evaluatepointstrain(nn, zeta, shapefunc, shapederiv, edisp(1:3, :), &
1377 director_increment, covariant_basis, use_green_lagrange, strain, reference_basis, &
1378 current_basis, reference_jacobian, current_jacobian)
1379 call shellmitc_evaluatetyingoperator(etype, naturalcoord(1), naturalcoord(2), nterms, &
1380 target_component, source_component, tying_point, tying_group, coefficient, replaced_component)
1382 if( replaced_component(c) ) strain(c) = 0.0d0
1385 strain(target_component(k)) = strain(target_component(k)) &
1386 +coefficient(k)*tying_strain(source_component(k), tying_point(k), tying_group(k))
1389 strain_tensor = 0.0d0
1390 strain_tensor(1, 1) = strain(1)
1391 strain_tensor(2, 2) = strain(2)
1392 strain_tensor(1, 2) = 0.5d0*strain(3)
1393 strain_tensor(2, 1) = strain_tensor(1, 2)
1394 strain_tensor(2, 3) = 0.5d0*strain(4)
1395 strain_tensor(3, 2) = strain_tensor(2, 3)
1396 strain_tensor(3, 1) = 0.5d0*strain(5)
1397 strain_tensor(1, 3) = strain_tensor(3, 1)
1399 material_local_basis = local_basis
1400 material_reciprocal_basis = reciprocal_basis
1401 if( use_green_lagrange )
then
1402 call shellmitc_basisfromcovariant(reference_basis, material_local_basis, material_reciprocal_basis, material_jacobian)
1405 dstrain = (/ strain(1), strain(2), 0.0d0, strain(3), strain(4), strain(5) /)
1411 subroutine shellmitc_updatestress(flag, update_state, gauss, n_layer, dstrain, &
1412 material_local_basis, material_reciprocal_basis, stress, alpha)
1418 integer(kind=kint),
intent(in) :: flag
1419 integer,
intent(in) :: n_layer
1420 logical,
intent(in) :: update_state
1422 real(kind=kreal),
intent(in) :: dstrain(6)
1423 real(kind=kreal),
intent(in) :: material_local_basis(3, 3)
1424 real(kind=kreal),
intent(in) :: material_reciprocal_basis(3, 3)
1425 real(kind=kreal),
intent(out) :: stress(6), alpha
1427 real(kind=kreal) :: d(5, 5), strain(5), stress_shell(5)
1428 real(kind=kreal) :: dstress(6), dstress_trace(6), trace_coeff
1430 strain = (/ dstrain(1), dstrain(2), dstrain(4), dstrain(5), dstrain(6) /)
1431 call matlmatrix_shell(gauss, shell, d, material_local_basis(:, shell_xi), &
1432 material_local_basis(:, shell_eta), material_local_basis(:, shell_zeta), material_reciprocal_basis(:, shell_xi), &
1433 material_reciprocal_basis(:, shell_eta), material_reciprocal_basis(:, shell_zeta), alpha, n_layer)
1435 stress_shell = matmul(d, strain)
1436 dstress = (/ stress_shell(1), stress_shell(2), 0.0d0, stress_shell(3), stress_shell(4), stress_shell(5) /)
1438 if( .not. update_state )
return
1441 trace_coeff = shellplanestresstracecoeff(gauss, n_layer)
1442 call shellobjectivetracestressincrement(gauss%stress_bak(1:6), dstrain, dstress_trace, trace_coeff)
1443 gauss%strain(1:6) = gauss%strain_bak(1:6)+dstrain
1444 gauss%stress(1:6) = gauss%stress_bak(1:6)+dstress_trace+dstress
1445 gauss%strain_energy = gauss%strain_energy_bak+dot_product(gauss%stress(1:6), dstrain)
1446 gauss%strain_energy = gauss%strain_energy-0.5d0*dot_product(dstress, dstrain)
1448 gauss%strain(1:6) = dstrain
1449 gauss%stress(1:6) = dstress
1450 gauss%strain_energy = 0.5d0*dot_product(gauss%stress(1:6), gauss%strain(1:6))
1452 stress = gauss%stress(1:6)
1453 end subroutine shellmitc_updatestress
1458 reciprocal_basis, reference_basis, current_basis, det_ref, det_cur, strain_out, stress_out)
1463 logical,
intent(in) :: use_gl_strain
1464 real(kind=kreal),
intent(in) :: s(3, 3), e(3, 3)
1465 real(kind=kreal),
intent(in) :: covariant_basis(3, 3), reciprocal_basis(3, 3)
1466 real(kind=kreal),
intent(in) :: reference_basis(3, 3), current_basis(3, 3)
1467 real(kind=kreal),
intent(in) :: det_ref, det_cur
1468 real(kind=kreal),
intent(out) :: strain_out(6), stress_out(6)
1471 real(kind=kreal) :: output_basis(3, 3), output_reciprocal_basis(3, 3)
1472 real(kind=kreal) :: reference_reciprocal_basis(3, 3), reference_local_basis(3, 3)
1473 real(kind=kreal) :: stress_tensor(3, 3), strain_tensor(3, 3)
1474 real(kind=kreal) :: stretch_b(3, 3), tensor(6), eigval(3), princ(3, 3)
1475 real(kind=kreal) :: logstrain(3, 3), cg_metric(3, 3)
1476 real(kind=kreal) :: det, jac, eig_norm
1478 output_basis = covariant_basis
1479 output_reciprocal_basis = reciprocal_basis
1481 if( use_gl_strain )
then
1482 output_basis = reference_basis
1483 call shellmitc_basisfromcovariant(reference_basis, reference_local_basis, reference_reciprocal_basis, det)
1484 output_reciprocal_basis = reference_reciprocal_basis
1487 stress_tensor = matmul(output_basis, matmul(s, transpose(output_basis)))
1488 strain_tensor = matmul(output_reciprocal_basis, matmul(e, transpose(output_reciprocal_basis)))
1489 call shelltensortostressvector(stress_tensor, stress_out)
1490 strain_out(1:3) = (/ strain_tensor(1, 1), strain_tensor(2, 2), strain_tensor(3, 3) /)
1494 if( use_gl_strain )
then
1495 strain_out(4:6) = (/ strain_tensor(1, 2), strain_tensor(2, 3), strain_tensor(3, 1) /)
1497 strain_out(4:6) = 2.0d0*(/ strain_tensor(1, 2), strain_tensor(2, 3), strain_tensor(3, 1) /)
1502 jac = det_cur/det_ref
1503 if( abs(jac) <= tiny(1.0d0) ) stop
"Fail to convert shell stress: detF=0"
1505 stress_tensor = matmul(current_basis, matmul(s, transpose(current_basis)))/jac
1506 cg_metric = matmul(transpose(reference_reciprocal_basis), reference_reciprocal_basis)
1507 stretch_b = matmul(current_basis, matmul(cg_metric, transpose(current_basis)))
1509 call shelltensortostressvector(stretch_b, tensor)
1512 if( eigval(i) <= 0.0d0 ) stop
"Fail to calc shell log strain: stretch<0"
1513 eigval(i) = 0.5d0*dlog(eigval(i))
1514 eig_norm = dsqrt(dot_product(princ(:, i), princ(:, i)))
1515 if( eig_norm <= 0.0d0 ) stop
"Fail to calc shell log strain: direction vector=0"
1516 princ(:, i) = princ(:, i)/eig_norm
1521 logstrain = logstrain+eigval(i)*outer_product3(princ(:, i), princ(:, i))
1524 call shelltensortostressvector(stress_tensor, stress_out)
1525 strain_out(1:3) = (/ logstrain(1, 1), logstrain(2, 2), logstrain(3, 3) /)
1526 strain_out(4:6) = 2.0d0*(/ logstrain(1, 2), logstrain(2, 3), logstrain(3, 1) /)
1531 real(kind=kreal),
intent(in) :: stress(6)
1532 real(kind=kreal),
intent(out) :: tensor(3, 3)
1535 tensor(1, 1) = stress(1)
1536 tensor(2, 2) = stress(2)
1537 tensor(3, 3) = stress(3)
1538 tensor(1, 2) = stress(4)
1539 tensor(2, 1) = stress(4)
1540 tensor(2, 3) = stress(5)
1541 tensor(3, 2) = stress(5)
1542 tensor(3, 1) = stress(6)
1543 tensor(1, 3) = stress(6)
1546 pure subroutine shelltensortostressvector(tensor, stress)
1547 real(kind=kreal),
intent(in) :: tensor(3, 3)
1548 real(kind=kreal),
intent(out) :: stress(6)
1550 stress(1) = tensor(1, 1)
1551 stress(2) = tensor(2, 2)
1552 stress(3) = tensor(3, 3)
1553 stress(4) = tensor(1, 2)
1554 stress(5) = tensor(2, 3)
1555 stress(6) = tensor(3, 1)
1556 end subroutine shelltensortostressvector
1558 pure subroutine shellobjectivetracestressincrement(stress_old, dstrain, dstress_trace, trace_coeff)
1559 real(kind=kreal),
intent(in) :: stress_old(6), dstrain(6)
1560 real(kind=kreal),
intent(out) :: dstress_trace(6)
1561 real(kind=kreal),
intent(in),
optional :: trace_coeff
1563 real(kind=kreal) :: stress_tensor(3, 3), dstress_tensor(3, 3)
1564 real(kind=kreal) :: trd, coeff
1568 if (
present(trace_coeff)) coeff = trace_coeff
1569 trd = coeff*(dstrain(1)+dstrain(2))+dstrain(3)
1570 dstress_tensor = -stress_tensor*trd
1571 call shelltensortostressvector(dstress_tensor, dstress_trace)
1572 end subroutine shellobjectivetracestressincrement
1574 pure subroutine shelladdulobjectivetracetangent(stress_old, ncol, B, DB, trace_coeff)
1575 integer(kind=kint),
intent(in) :: ncol
1576 real(kind=kreal),
intent(in) :: stress_old(6), b(5, ncol)
1577 real(kind=kreal),
intent(inout) :: db(5, ncol)
1578 real(kind=kreal),
intent(in),
optional :: trace_coeff
1580 integer(kind=kint) :: j
1581 real(kind=kreal) :: dstrain_col(6), dstress_trace(6)
1585 dstrain_col(1:2) = b(1:2, j)
1586 call shellobjectivetracestressincrement(stress_old, dstrain_col, dstress_trace, trace_coeff)
1587 db(1, j) = db(1, j)+dstress_trace(1)
1588 db(2, j) = db(2, j)+dstress_trace(2)
1589 db(3, j) = db(3, j)+dstress_trace(4)
1590 db(4, j) = db(4, j)+dstress_trace(5)
1591 db(5, j) = db(5, j)+dstress_trace(6)
1593 end subroutine shelladdulobjectivetracetangent
1595 pure subroutine shelldirectorincrementalsecondderiv(director_current, director_second)
1596 real(kind=kreal),
intent(in) :: director_current(3)
1597 real(kind=kreal),
intent(out) :: director_second(3, 3, 3)
1600 real(kind=kreal) :: basis_m(3), basis_n(3)
1601 real(kind=kreal) :: cross_n(3), cross_mn(3), cross_m(3), cross_nm(3)
1613 director_second(:, m, n) = 0.5d0*(cross_mn+cross_nm)
1616 end subroutine shelldirectorincrementalsecondderiv
1619 subroutine shellmitc_abortnonlinearunsupported(etype)
1620 integer(kind=kint),
intent(in) :: etype
1622 write(*,*)
'###ERROR### : Element type not supported for nonlinear static analysis'
1623 write(*,*)
' ic_type = ', etype
1624 call hecmw_abort(hecmw_comm_get_comm())
1625 end subroutine shellmitc_abortnonlinearunsupported
1630 subroutine shellmitc_integratestiffnesslayer(etype, nn, ndof, ilayer, kinematics, &
1631 finite_rotation, use_director_tangent, use_green_lagrange, &
1632 add_geometric_stiffness, ecoord, elem, shell_disp, gausses, element, &
1633 v1, v2, v3, director, reference_director, director_tangent, &
1634 director_second_tangent, nodal_kinematic_dofs, nddrill, stiff_work)
1640 integer(kind=kint),
intent(in) :: etype, nn, ndof, ilayer, kinematics
1641 logical,
intent(in) :: finite_rotation, use_director_tangent
1642 logical,
intent(in) :: use_green_lagrange, add_geometric_stiffness
1643 real(kind=kreal),
intent(in) :: ecoord(3, nn), elem(3, nn), shell_disp(6, nn)
1645 type(
telement),
intent(in),
optional :: element
1646 real(kind=kreal),
intent(in) :: v1(3, nn), v2(3, nn), v3(3, nn)
1647 real(kind=kreal),
intent(in) :: director(3, nn), reference_director(3, nn)
1648 real(kind=kreal),
intent(in) :: director_tangent(3, 3, nn)
1649 real(kind=kreal),
intent(in) :: director_second_tangent(3, 3, 3, nn)
1650 real(kind=kreal),
intent(in) :: nodal_kinematic_dofs(ndof*nn)
1651 real(kind=kreal),
intent(in),
optional :: nddrill(nn)
1652 real(kind=kreal),
intent(inout) :: stiff_work(ndof*nn, ndof*nn)
1654 integer :: lx, ly, ny, isize, jsize, ishell
1655 integer(kind=kint) :: ierr
1656 real(kind=kreal) :: zeta_ly, tying_zeta, xi_lx, eta_lx
1657 real(kind=kreal) :: surface_weight, thickness_weight, integration_jacobian
1658 real(kind=kreal) :: integration_weight, layer_weight
1659 real(kind=kreal) :: naturalcoord(2), shapefunc(nn), shapederiv(nn, 2)
1660 real(kind=kreal) :: d(5, 5), b(5, ndof*nn), db(5, ndof*nn)
1661 real(kind=kreal) :: basis_variation(3, ndof*nn, 3)
1662 real(kind=kreal) :: stress_vec(5), stress_old_vec(6), alpha, trace_coeff
1663 real(kind=kreal) :: point_triad(3, 3), covariant_basis(3, 3)
1664 real(kind=kreal) :: tangent_basis(3, 2), reciprocal_basis(3, 3), local_basis(3, 3)
1665 real(kind=kreal) :: material_reciprocal_basis(3, 3), material_local_basis(3, 3)
1666 real(kind=kreal) :: director_contribution(3, nn, 3)
1667 real(kind=kreal) :: director_second_variation(5, 3, 3, nn)
1668 real(kind=kreal) :: tying_b(5, ndof*nn, 6, 3)
1669 real(kind=kreal) :: tying_basis_variation(3, ndof*nn, 3, 6, 3)
1670 real(kind=kreal) :: tying_director_second_variation(5, 3, 3, nn, 6, 3)
1671 real(kind=kreal) :: cv(ndof*nn), cv_disp, cv_w_second(3, 3, nn)
1674 layer_weight = gausses(1)%pMaterial%shell_var(ilayer)%weight
1676 director_second_variation = 0.0d0
1681 tying_zeta = shellmitc_tyingzeta(etype, 0.0d0)
1682 call shellmitc_evaluatetyingstiffnessdataatzeta(etype, nn, ndof, tying_zeta, &
1683 elem, shell_disp, director, director_tangent, director_second_tangent, &
1684 use_green_lagrange, use_director_tangent, tying_b, tying_basis_variation, tying_director_second_variation)
1689 if( ierr /= 0 ) cycle
1693 tying_zeta = shellmitc_tyingzeta(etype, zeta_ly)
1694 call shellmitc_evaluatetyingstiffnessdataatzeta(etype, nn, ndof, tying_zeta, &
1695 elem, shell_disp, director, director_tangent, director_second_tangent, &
1696 use_green_lagrange, use_director_tangent, tying_b, tying_basis_variation, tying_director_second_variation)
1701 xi_lx = naturalcoord(shell_xi)
1702 eta_lx = naturalcoord(shell_eta)
1707 point_triad(:, shell_xi) = matmul(v1, shapefunc)
1708 point_triad(:, shell_eta) = matmul(v2, shapefunc)
1709 point_triad(:, shell_zeta) = matmul(v3, shapefunc)
1711 call shellmitc_preparepointkinematics(etype, nn, use_green_lagrange, ecoord, elem, &
1712 shell_disp(1:3, :), director, reference_director, zeta_ly, shapefunc, shapederiv, &
1713 covariant_basis, tangent_basis, reciprocal_basis, local_basis, &
1714 material_reciprocal_basis, material_local_basis, integration_jacobian, director_contribution)
1716 if( add_geometric_stiffness .and.
present(element) )
then
1722 if( ishell > 0 )
then
1724 material_local_basis(:, shell_xi), material_local_basis(:, shell_eta), material_local_basis(:, shell_zeta), &
1725 material_reciprocal_basis(:, shell_xi), material_reciprocal_basis(:, shell_eta), &
1726 material_reciprocal_basis(:, shell_zeta), alpha, ilayer)
1729 material_local_basis(:, shell_xi), material_local_basis(:, shell_eta), material_local_basis(:, shell_zeta), &
1730 material_reciprocal_basis(:, shell_xi), material_reciprocal_basis(:, shell_eta), &
1731 material_reciprocal_basis(:, shell_zeta), alpha, ilayer)
1734 call shellmitc_buildfirststrainvariation(nn, ndof, zeta_ly, shapefunc, shapederiv, &
1735 covariant_basis, tangent_basis, director_contribution, director_tangent, use_director_tangent, b, basis_variation)
1736 if( use_director_tangent )
then
1737 call shellmitc_builddirectorsecondvariation(nn, zeta_ly, shapefunc, shapederiv, &
1738 covariant_basis, director_second_tangent, director_second_variation)
1741 if( use_director_tangent )
then
1742 call shellmitc_applyassumedstrain(etype, nn, ndof, xi_lx, eta_lx, tying_b, b, &
1743 tying_director_second_variation, director_second_variation)
1745 call shellmitc_applyassumedstrain(etype, nn, ndof, xi_lx, eta_lx, tying_b, b)
1748 integration_weight = surface_weight*thickness_weight*integration_jacobian
1750 if( add_geometric_stiffness )
then
1751 if( ishell > 0 )
then
1752 stress_vec = (/ element%shell_layer_gausses(ishell)%stress(1), element%shell_layer_gausses(ishell)%stress(2), &
1753 element%shell_layer_gausses(ishell)%stress(4), element%shell_layer_gausses(ishell)%stress(5), &
1754 element%shell_layer_gausses(ishell)%stress(6) /)
1756 stress_vec = (/ gausses(lx)%stress(1), gausses(lx)%stress(2), &
1757 gausses(lx)%stress(4), gausses(lx)%stress(5), gausses(lx)%stress(6) /)
1763 if( ishell > 0 )
then
1764 stress_old_vec = element%shell_layer_gausses(ishell)%stress_bak(1:6)
1765 trace_coeff = shellplanestresstracecoeff(element%shell_layer_gausses(ishell), ilayer)
1767 stress_old_vec = gausses(lx)%stress_bak(1:6)
1768 trace_coeff = shellplanestresstracecoeff(gausses(lx), ilayer)
1770 call shelladdulobjectivetracetangent(stress_old_vec, ndof*nn, b, db, trace_coeff=trace_coeff)
1773 do jsize = 1, ndof*nn
1774 do isize = 1, ndof*nn
1775 stiff_work(isize, jsize) = stiff_work(isize, jsize) &
1776 +integration_weight*layer_weight*dot_product(b(:, isize), db(:, jsize))
1780 call shellmitc_addgeometricstiffness(etype, nn, ndof, kinematics, &
1781 use_director_tangent, use_green_lagrange, add_geometric_stiffness, &
1782 xi_lx, eta_lx, integration_weight, layer_weight, stress_vec, b, &
1783 basis_variation, tying_basis_variation, reciprocal_basis, material_local_basis, &
1784 material_reciprocal_basis, director_second_variation, director, stiff_work)
1787 director_second_tangent, material_reciprocal_basis, point_triad, use_director_tangent, cv_w_second)
1788 call shellmitc_builddrillingvector(nn, ndof, finite_rotation, shapefunc, &
1789 point_triad, material_reciprocal_basis, basis_variation, nodal_kinematic_dofs, director, nddrill, cv, cv_disp)
1790 call shellmitc_adddrillingstiffness(nn, ndof, finite_rotation, &
1791 use_director_tangent, shapefunc, cv, cv_disp, cv_w_second, nodal_kinematic_dofs, &
1792 director, director_tangent, alpha, integration_weight, layer_weight, nddrill, stiff_work)
1795 end subroutine shellmitc_integratestiffnesslayer
1801 finite_rotation, use_director_tangent, use_green_lagrange, update_state, &
1802 ecoord, evaluation_coords, total_nodal_state, strain_nodal_state, gausses, element, &
1803 v1, v2, v3, director, reference_director, director_tangent, stress_elem, &
1804 stress_director, stress_director_increment, nodal_kinematic_dofs, nddrill, qf_work)
1809 integer(kind=kint),
intent(in) :: etype, nn, ndof, ilayer, kinematics
1810 logical,
intent(in) :: finite_rotation, use_director_tangent
1811 logical,
intent(in) :: use_green_lagrange, update_state
1812 real(kind=kreal),
intent(in) :: ecoord(3, nn), evaluation_coords(3, nn)
1813 real(kind=kreal),
intent(in) :: total_nodal_state(6, nn), strain_nodal_state(6, nn)
1815 type(
telement),
intent(inout),
optional :: element
1816 real(kind=kreal),
intent(in) :: v1(3, nn), v2(3, nn), v3(3, nn)
1817 real(kind=kreal),
intent(in) :: director(3, nn), reference_director(3, nn)
1818 real(kind=kreal),
intent(in) :: director_tangent(3, 3, nn)
1819 real(kind=kreal),
intent(in) :: stress_elem(3, nn), stress_director(3, nn)
1820 real(kind=kreal),
intent(in) :: stress_director_increment(3, nn)
1821 real(kind=kreal),
intent(in) :: nodal_kinematic_dofs(ndof*nn)
1822 real(kind=kreal),
intent(in),
optional :: nddrill(nn)
1823 real(kind=kreal),
intent(inout) :: qf_work(ndof*nn)
1825 integer :: lx, ly, ny, ishell
1826 integer(kind=kint) :: ierr
1827 logical :: store_state
1830 real(kind=kreal) :: zeta_ly, tying_zeta, xi, eta
1831 real(kind=kreal) :: surface_weight, thickness_weight, integration_jacobian
1832 real(kind=kreal) :: integration_weight, layer_weight
1833 real(kind=kreal) :: naturalcoord(2), shapefunc(nn), shapederiv(nn, 2)
1834 real(kind=kreal) :: b(5, ndof*nn), strain_vec(5), stress_vec(5), alpha
1835 real(kind=kreal) :: basis_variation(3, ndof*nn, 3), point_triad(3, 3)
1836 real(kind=kreal) :: covariant_basis(3, 3), tangent_basis(3, 2)
1837 real(kind=kreal) :: reciprocal_basis(3, 3), local_basis(3, 3)
1838 real(kind=kreal) :: material_reciprocal_basis(3, 3), material_local_basis(3, 3)
1839 real(kind=kreal) :: director_contribution(3, nn, 3)
1840 real(kind=kreal) :: tying_b(5, ndof*nn, 6, 3), tying_strain(5, 6, 3)
1841 real(kind=kreal) :: dstrain(6), stress(6), strain_out(6), stress_out(6)
1842 real(kind=kreal) :: strain_tensor(3, 3), stress_tensor(3, 3)
1843 real(kind=kreal) :: stress_covariant_basis(3, 3), stress_reciprocal_basis(3, 3)
1844 real(kind=kreal) :: stress_material_local_basis(3, 3)
1845 real(kind=kreal) :: stress_material_reciprocal_basis(3, 3)
1846 real(kind=kreal) :: reference_basis(3, 3), current_basis(3, 3)
1847 real(kind=kreal) :: reference_jacobian, current_jacobian
1848 real(kind=kreal) :: cv(ndof*nn), cv_disp
1851 layer_weight = gausses(1)%pMaterial%shell_var(ilayer)%weight
1854 tying_zeta = shellmitc_tyingzeta(etype, 0.0d0)
1855 call shellmitc_evaluatetyingbatzeta(etype, nn, ndof, tying_zeta, evaluation_coords, &
1856 total_nodal_state, director, director_tangent, use_green_lagrange, use_director_tangent, tying_b)
1861 if( ierr /= 0 ) cycle
1864 tying_zeta = shellmitc_tyingzeta(etype, zeta_ly)
1865 call shellmitc_evaluatetyingbatzeta(etype, nn, ndof, tying_zeta, evaluation_coords, &
1866 total_nodal_state, director, director_tangent, use_green_lagrange, use_director_tangent, tying_b)
1869 if( update_state )
then
1870 call shellmitc_evaluatetyingstrains(etype, nn, zeta_ly, stress_elem, &
1871 strain_nodal_state, stress_director, stress_director_increment, use_green_lagrange, tying_strain)
1876 xi = naturalcoord(shell_xi)
1877 eta = naturalcoord(shell_eta)
1883 store_state = .false.
1884 if( update_state .and.
present(element) )
then
1886 store_state = ishell > 0
1888 if( update_state .and. .not. store_state )
then
1889 stop
"Missing shell layer Gauss state"
1891 if( store_state )
then
1892 gauss => element%shell_layer_gausses(ishell)
1894 gauss_work = gausses(lx)
1898 if( update_state )
then
1900 strain_nodal_state, stress_director, stress_director_increment, &
1901 use_green_lagrange, tying_strain, dstrain, strain_tensor, stress_covariant_basis, stress_reciprocal_basis, &
1902 stress_material_local_basis, stress_material_reciprocal_basis, &
1903 reference_basis, current_basis, reference_jacobian, current_jacobian)
1906 point_triad(:, shell_xi) = matmul(v1, shapefunc)
1907 point_triad(:, shell_eta) = matmul(v2, shapefunc)
1908 point_triad(:, shell_zeta) = matmul(v3, shapefunc)
1909 call shellmitc_preparepointkinematics(etype, nn, use_green_lagrange, ecoord, &
1910 evaluation_coords, total_nodal_state(1:3, :), director, reference_director, &
1911 zeta_ly, shapefunc, shapederiv, covariant_basis, tangent_basis, reciprocal_basis, &
1912 local_basis, material_reciprocal_basis, material_local_basis, integration_jacobian, director_contribution)
1914 call shellmitc_buildfirststrainvariation(nn, ndof, zeta_ly, shapefunc, shapederiv, &
1915 covariant_basis, tangent_basis, director_contribution, director_tangent, use_director_tangent, b, basis_variation)
1916 call shellmitc_applyassumedstrain(etype, nn, ndof, xi, eta, tying_b, b)
1918 if( .not. update_state )
then
1919 strain_vec = matmul(b, nodal_kinematic_dofs)
1920 dstrain = (/ strain_vec(1), strain_vec(2), 0.0d0, strain_vec(3), strain_vec(4), strain_vec(5) /)
1921 stress_material_local_basis = material_local_basis
1922 stress_material_reciprocal_basis = material_reciprocal_basis
1925 call shellmitc_updatestress(kinematics, store_state, gauss, ilayer, dstrain, &
1926 stress_material_local_basis, stress_material_reciprocal_basis, stress, alpha)
1928 if( store_state )
then
1930 gauss%strain_out(1:6) = gauss%strain(1:6)
1931 gauss%stress_out(1:6) = gauss%stress(1:6)
1935 stress_covariant_basis, stress_reciprocal_basis, reference_basis, &
1936 current_basis, reference_jacobian, current_jacobian, strain_out, stress_out)
1937 gauss%strain_out(1:6) = strain_out
1938 gauss%stress_out(1:6) = stress_out
1942 stress_vec = (/ stress(1), stress(2), stress(4), stress(5), stress(6) /)
1943 integration_weight = surface_weight*thickness_weight*integration_jacobian
1944 qf_work = qf_work+integration_weight*layer_weight*matmul(stress_vec, b)
1946 call shellmitc_builddrillingvector(nn, ndof, finite_rotation, shapefunc, &
1947 point_triad, material_reciprocal_basis, basis_variation, nodal_kinematic_dofs, director, nddrill, cv, cv_disp)
1948 qf_work = qf_work+integration_weight*layer_weight*alpha*cv*cv_disp
1960 nddisp, element, ndtriad, ndreftriad, ndcurtriad, nddrill)
1965 integer(kind=kint),
intent(in) :: etype, nn, mixflag, ndof
1966 real(kind=kreal),
intent(in) :: ecoord(3, nn), thick
1968 real(kind=kreal),
intent(out) :: stiff(:, :)
1969 real(kind=kreal),
intent(in),
optional :: nddisp(ndof, nn)
1970 type(
telement),
intent(in),
optional :: element
1973 real(kind=kreal),
intent(in),
optional :: ndtriad(9, nn)
1974 real(kind=kreal),
intent(in),
optional :: ndreftriad(9, nn), ndcurtriad(9, nn)
1975 real(kind=kreal),
intent(in),
optional :: nddrill(nn)
1977 integer :: ndof_shell, nb, ilayer, nlayer
1978 integer(kind=kint) :: kinematics
1979 logical :: finite_rotation, use_director_tangent, use_green_lagrange
1980 logical :: add_geometric_stiffness, update_state
1981 real(kind=kreal) :: elem(3, nn), shell_disp(6, nn)
1982 real(kind=kreal) :: v1(3, nn), v2(3, nn), v3(3, nn)
1983 real(kind=kreal) :: director(3, nn), reference_director(3, nn)
1984 real(kind=kreal) :: director_tangent(3, 3, nn)
1985 real(kind=kreal) :: director_second_tangent(3, 3, 3, nn)
1986 real(kind=kreal) :: nodal_kinematic_dofs(ndof*nn)
1987 real(kind=kreal) :: stiff_work(ndof*nn, ndof*nn)
1990 director_second_tangent = 0.0d0
1991 ndof_shell = min(ndof, 6)
1992 if(
present(nddisp) ) shell_disp(1:ndof_shell, :) = nddisp(1:ndof_shell, :)
1994 call shellmitc_resolveformulation(etype, nn, ndof, gausses(1),
present(nddisp), &
1995 present(element), .true., kinematics, ndof_shell, finite_rotation, &
1996 use_director_tangent, use_green_lagrange, add_geometric_stiffness, update_state)
1999 use_director_tangent, use_director_tangent, ecoord, shell_disp, ndtriad, ndreftriad, &
2000 ndcurtriad, elem, v1, v2, v3, director, reference_director, director_tangent, director_second_tangent)
2004 nodal_kinematic_dofs = 0.0d0
2006 nodal_kinematic_dofs(ndof*(nb-1)+1:ndof*(nb-1)+ndof_shell) = shell_disp(1:ndof_shell, nb)
2009 nlayer = gausses(1)%pMaterial%totallyr
2010 do ilayer = 1, nlayer
2011 call shellmitc_integratestiffnesslayer(etype, nn, ndof, ilayer, kinematics, &
2012 finite_rotation, use_director_tangent, use_green_lagrange, &
2013 add_geometric_stiffness, ecoord, elem, shell_disp, gausses, element, &
2014 v1, v2, v3, director, reference_director, director_tangent, &
2015 director_second_tangent, nodal_kinematic_dofs, nddrill, stiff_work)
2018 stiff(1:nn*ndof, 1:nn*ndof) = stiff_work
2019 call shellapplymixeddofordering(mixflag, nn, ndof, stiff=stiff)
2025 strain, stress, thick, zeta, n_layer, surface_gauss_points, &
2026 local_strain, local_stress, local_stress_override, ndtriad, ndreftriad, ndbase_disp)
2031 integer(kind=kint),
intent(in) :: etype, nn, ndof
2032 integer,
intent(in) :: n_layer
2033 real(kind=kreal),
intent(in) :: ecoord(3, nn), edisp(6, nn), thick, zeta
2035 real(kind=kreal),
intent(out) :: strain(:, :), stress(:, :)
2036 logical,
intent(in),
optional :: surface_gauss_points
2037 real(kind=kreal),
intent(out),
optional :: local_strain(:, :), local_stress(:, :)
2038 real(kind=kreal),
intent(in),
optional :: local_stress_override(:, :)
2041 real(kind=kreal),
intent(in),
optional :: ndtriad(9, nn), ndreftriad(9, nn)
2042 real(kind=kreal),
intent(in),
optional :: ndbase_disp(6, nn)
2044 integer :: lx, npoints
2045 integer(kind=kint) :: ierr_quad, kinematics, ndof_shell
2046 logical :: finite_rotation, use_director_tangent, use_green_lagrange
2047 logical :: add_geometric_stiffness, update_state, use_surface_gauss
2049 real(kind=kreal) :: elem(3, nn), naturalcoord(2), nncoord(nn, 2), zeta_ly
2050 real(kind=kreal) :: director(3, nn), director_increment(3, nn)
2051 real(kind=kreal) :: v1(3, nn), v2(3, nn), v3(3, nn)
2052 real(kind=kreal) :: a_over_2_v3(3, nn), a_over_2_v3_ref(3, nn)
2053 real(kind=kreal) :: a_over_2_v3_deriv(3, 3, nn), a_over_2_v3_second(3, 3, 3, nn)
2054 real(kind=kreal) :: tying_strain(5, 6, 3)
2055 real(kind=kreal) :: point_strain(6), point_stress(6), alpha
2056 real(kind=kreal) :: strain_tensor(3, 3), stress_tensor(3, 3)
2057 real(kind=kreal) :: covariant_basis(3, 3), reciprocal_basis(3, 3)
2058 real(kind=kreal) :: material_local_basis(3, 3), material_reciprocal_basis(3, 3)
2059 real(kind=kreal) :: reference_basis(3, 3), current_basis(3, 3)
2060 real(kind=kreal) :: reference_jacobian, current_jacobian
2062 use_surface_gauss = .false.
2063 if(
present(surface_gauss_points) ) use_surface_gauss = surface_gauss_points
2066 call shellmitc_resolveformulation(etype, nn, ndof, gausses(1), .true., .false., &
2067 .false., kinematics, ndof_shell, finite_rotation, use_director_tangent, &
2068 use_green_lagrange, add_geometric_stiffness, update_state)
2071 if( kinematics ==
updatelag .and.
present(ndbase_disp) ) elem = elem+ndbase_disp(1:3, :)
2072 if( kinematics ==
updatelag ) elem = elem+0.5d0*edisp(1:3, :)
2073 call shellmitc_setupnodaldirectors(etype, nn, thick, kinematics, elem, edisp, &
2074 finite_rotation, use_director_tangent, .false., ndtriad, ndreftriad, &
2075 v1=v1, v2=v2, v3=v3, a_over_2_v3=a_over_2_v3, a_over_2_v3_ref=a_over_2_v3_ref, &
2076 a_over_2_v3_deriv=a_over_2_v3_deriv, a_over_2_v3_second=a_over_2_v3_second)
2078 call shellmitc_setupstresskinematics(nn, ecoord, kinematics, finite_rotation, edisp, &
2079 a_over_2_v3, a_over_2_v3_ref, a_over_2_v3_deriv, ndbase_disp, elem, director, director_increment)
2081 call shellmitc_evaluatetyingstrains(etype, nn, zeta, elem, edisp, director, &
2082 director_increment, use_green_lagrange, tying_strain)
2084 if( ierr_quad /= 0 ) stop
"Invalid shell layer zeta"
2089 if( use_surface_gauss )
then
2092 naturalcoord = nncoord(lx, :)
2096 director, director_increment, use_green_lagrange, tying_strain, point_strain, &
2097 strain_tensor, covariant_basis, reciprocal_basis, material_local_basis, &
2098 material_reciprocal_basis, reference_basis, current_basis, reference_jacobian, current_jacobian)
2100 if(
present(local_stress_override) .and. lx <=
size(local_stress_override, 1) &
2101 .and.
size(local_stress_override, 2) >= 6 )
then
2102 point_stress = (/ local_stress_override(lx, 1), local_stress_override(lx, 2), 0.0d0, local_stress_override(lx, 4), &
2103 local_stress_override(lx, 5), local_stress_override(lx, 6) /)
2105 gauss_work = gausses(lx)
2106 call shellmitc_updatestress(kinematics, update_state, gauss_work, n_layer, &
2107 point_strain, material_local_basis, material_reciprocal_basis, point_stress, alpha)
2112 covariant_basis, reciprocal_basis, reference_basis, current_basis, &
2113 reference_jacobian, current_jacobian, strain(lx, 1:6), stress(lx, 1:6))
2114 if(
present(local_strain) ) local_strain(lx, 1:6) = point_strain
2115 if(
present(local_stress) ) local_stress(lx, 1:6) = point_stress
2122 subroutine dl_shell(etype, nn, ndof, xx, yy, zz, rho, thick, ltype, params, vect, nsize, gausses)
2126 integer(kind=kint),
intent(in) :: etype, nn, ndof
2127 real(kind=kreal),
intent(in) :: xx(*), yy(*), zz(*), rho, thick, params(*)
2128 integer,
intent(in) :: ltype
2129 real(kind=kreal),
intent(out) :: vect(*)
2130 integer(kind=kint),
intent(out) :: nsize
2133 integer :: ny, lx, ly, nb, ilayer, nlayer, jsize
2134 integer(kind=kint) :: ierr_quad
2135 real(kind=kreal) :: elem(3, nn)
2136 real(kind=kreal) :: v1(3, nn), v2(3, nn), v3(3, nn), director(3, nn)
2137 real(kind=kreal) :: naturalcoord(2), shapefunc(nn), shapederiv(nn, 2)
2138 real(kind=kreal) :: covariant_basis(3, 3), normal_jac(3), n(3, ndof*nn)
2139 real(kind=kreal) :: body_force(3), position(3), origin(3), axis(3), radial(3)
2140 real(kind=kreal) :: val, zeta, surface_weight, thickness_weight, integration_weight, projection
2143 vect(1:nsize) = 0.0d0
2144 elem(1, :) = xx(1:nn)
2145 elem(2, :) = yy(1:nn)
2146 elem(3, :) = zz(1:nn)
2148 origin = params(2:4)
2152 if (ltype >= 10)
then
2158 covariant_basis(:, shell_xi:shell_eta) = matmul(elem, shapederiv)
2159 call cross_product(covariant_basis(:, shell_xi), covariant_basis(:, shell_eta), normal_jac)
2162 vect(jsize+1:jsize+3) = vect(jsize+1:jsize+3) + surface_weight*shapefunc(nb)*normal_jac*val
2167 nlayer = gausses(1)%pMaterial%totallyr
2168 do ilayer = 1, nlayer
2171 if (ierr_quad /= 0) cycle
2178 integration_weight = surface_weight*thickness_weight *shellmitc_covariantjacobian(covariant_basis)
2179 call shellmitc_buildinterpolationmatrix(nn, ndof, zeta, shapefunc, director, n)
2190 body_force = rho*val*origin
2192 position = matmul(elem, shapefunc)
2193 projection = dot_product(position-origin, axis)/dot_product(axis, axis)
2194 radial = position-(origin+projection*axis)
2195 body_force = rho*val*val*radial
2197 vect(1:nsize) = vect(1:nsize)+integration_weight*matmul(body_force, n)
2206 subroutine dl_shell_33(ic_type, nn, ndof, xx, yy, zz, rho, thick, ltype, params, vect, nsize, gausses)
2210 integer(kind=kint),
intent(in) :: ic_type, nn, ndof
2211 real(kind=kreal),
intent(in) :: xx(*), yy(*), zz(*), rho, thick, params(*)
2212 integer,
intent(in) :: ltype
2213 real(kind=kreal),
intent(out) :: vect(*)
2214 integer(kind=kint),
intent(out) :: nsize
2217 select case (ic_type)
2219 call dl_shell(
fe_mitc3_shell, 3_kint, 6_kint, xx, yy, zz, rho, thick, ltype, params, vect, nsize, gausses)
2220 call shellapplymixeddofordering(2_kint, 3_kint, 6_kint, qf=vect(1:18))
2222 call dl_shell(
fe_mitc4_shell, 4_kint, 6_kint, xx, yy, zz, rho, thick, ltype, params, vect, nsize, gausses)
2223 call shellapplymixeddofordering(1_kint, 4_kint, 6_kint, qf=vect(1:24))
2226 vect(1:nsize) = 0.0d0
2231 subroutine update_shell_mitc(etype, nn, ndof, ecoord, u, du, gausses, qf, thick, mixflag, &
2232 nddisp, element, ndtriad, ndreftriad, ndcurtriad, nddrill)
2238 integer(kind=kint),
intent(in) :: etype, nn, ndof, mixflag
2239 real(kind=kreal),
intent(in) :: ecoord(3, nn), u(:, :), du(:, :), thick
2241 real(kind=kreal),
intent(out) :: qf(:)
2242 real(kind=kreal),
intent(in),
optional :: nddisp(ndof, nn)
2243 type(
telement),
intent(inout),
optional :: element
2246 real(kind=kreal),
intent(in),
optional :: ndtriad(9, nn), ndreftriad(9, nn)
2247 real(kind=kreal),
intent(in),
optional :: ndcurtriad(9, nn), nddrill(nn)
2249 integer :: ndof_shell, nb, ilayer, nlayer
2250 integer(kind=kint) :: kinematics
2251 logical :: finite_rotation, use_director_tangent, use_green_lagrange
2252 logical :: add_geometric_stiffness, update_state
2253 real(kind=kreal) :: total_nodal_state(6, nn), strain_nodal_state(6, nn)
2254 real(kind=kreal) :: step_base_nodal_state(6, nn)
2255 real(kind=kreal) :: nodal_kinematic_dofs(ndof*nn), qf_work(ndof*nn)
2256 real(kind=kreal) :: evaluation_coords(3, nn), stress_elem(3, nn)
2257 real(kind=kreal) :: v1(3, nn), v2(3, nn), v3(3, nn)
2258 real(kind=kreal) :: director(3, nn), reference_director(3, nn)
2259 real(kind=kreal) :: director_tangent(3, 3, nn)
2260 real(kind=kreal) :: director_second_tangent(3, 3, 3, nn)
2261 real(kind=kreal) :: stress_director(3, nn), stress_director_increment(3, nn)
2263 call shellmitc_resolveformulation(etype, nn, ndof, gausses(1), .true.,
present(element), &
2264 .true., kinematics, ndof_shell, finite_rotation, use_director_tangent, &
2265 use_green_lagrange, add_geometric_stiffness, update_state)
2267 total_nodal_state = 0.0d0
2268 strain_nodal_state = 0.0d0
2269 step_base_nodal_state = 0.0d0
2271 total_nodal_state(1:ndof_shell, nb) = u(1:ndof_shell, nb)+du(1:ndof_shell, nb)
2272 strain_nodal_state(1:ndof_shell, nb) = total_nodal_state(1:ndof_shell, nb)
2273 step_base_nodal_state(1:ndof_shell, nb) = u(1:ndof_shell, nb)
2274 if( finite_rotation )
then
2276 strain_nodal_state(4:6, nb) = total_nodal_state(4:6, nb)
2279 if(
present(nddisp) ) total_nodal_state(1:ndof_shell, :) = nddisp(1:ndof_shell, :)
2280 if( kinematics ==
updatelag .and. update_state )
then
2281 strain_nodal_state = du(1:6, 1:nn)
2284 nodal_kinematic_dofs = 0.0d0
2286 nodal_kinematic_dofs(ndof*(nb-1)+1:ndof*(nb-1)+ndof_shell) = total_nodal_state(1:ndof_shell, nb)
2289 director_second_tangent = 0.0d0
2291 stress_director = 0.0d0
2292 stress_director_increment = 0.0d0
2295 use_director_tangent, .false., ecoord, total_nodal_state, ndtriad, ndreftriad, &
2296 ndcurtriad, evaluation_coords, v1, v2, v3, director, reference_director, director_tangent, director_second_tangent)
2298 if( update_state )
then
2299 call shellmitc_setupstresskinematics(nn, ecoord, kinematics, finite_rotation, &
2300 strain_nodal_state, director, reference_director, director_tangent, &
2301 step_base_nodal_state, stress_elem, stress_director, stress_director_increment)
2304 nlayer = gausses(1)%pMaterial%totallyr
2305 do ilayer = 1, nlayer
2307 finite_rotation, use_director_tangent, use_green_lagrange, update_state, &
2308 ecoord, evaluation_coords, total_nodal_state, strain_nodal_state, gausses, element, &
2309 v1, v2, v3, director, reference_director, director_tangent, stress_elem, &
2310 stress_director, stress_director_increment, nodal_kinematic_dofs, nddrill, qf_work)
2313 qf(1:ndof*nn) = qf_work
2314 call shellapplymixeddofordering(mixflag, nn, ndof, qf=qf(1:ndof*nn))
2318 subroutine update_shell_mitc33(etype, nn, ndof, ecoord, u, du, gausses, qf, thick, mixflag, nddisp)
2323 integer(kind=kint),
intent(in) :: etype, nn, ndof, mixflag
2324 real(kind=kreal),
intent(in) :: ecoord(3, nn), u(3, nn*2), du(3, nn*2), thick
2326 real(kind=kreal),
intent(out) :: qf(:)
2327 real(kind=kreal),
intent(in),
optional :: nddisp(3, nn)
2329 integer :: i, sstable(ndof*nn)
2330 real(kind=kreal) :: mixed_disp(ndof*nn), natural_disp(ndof*nn)
2331 real(kind=kreal) :: shell_u(6, nn), shell_du(6, nn), shell_nddisp(6, nn)
2336 mixed_disp(ndof*(i-1)+1:ndof*(i-1)+3) = u(1:3, 2*i-1)+du(1:3, 2*i-1)
2337 mixed_disp(ndof*(i-1)+4:ndof*(i-1)+6) = u(1:3, 2*i)+du(1:3, 2*i)
2340 call shellmixeddofmap(mixflag, nn, ndof, sstable, is_mixed)
2341 natural_disp = mixed_disp
2344 natural_disp(sstable(i)) = mixed_disp(i)
2350 shell_du(:, i) = natural_disp(ndof*(i-1)+1:ndof*i)
2352 if(
present(nddisp) )
then
2353 shell_nddisp = shell_du
2354 shell_nddisp(1:3, :) = nddisp
2355 call update_shell_mitc(etype, nn, ndof, ecoord, shell_u, shell_du, gausses, qf, thick, mixflag, nddisp=shell_nddisp)
2357 call update_shell_mitc(etype, nn, ndof, ecoord, shell_u, shell_du, gausses, qf, thick, mixflag)
2364 subroutine mass_shell(etype, nn, elem, rho, thick, gausses, mass, lumped)
2368 integer(kind=kint),
intent(in) :: etype, nn
2369 real(kind=kreal),
intent(in) :: elem(3, nn), rho, thick
2371 real(kind=kreal),
intent(out) :: mass(:, :), lumped(:)
2373 integer(kind=kint),
parameter :: ndof = 6_kint
2374 integer :: ny, nsize, lx, ly, nb, i, ilayer, nlayer, idof
2375 integer(kind=kint) :: ierr_quad
2376 real(kind=kreal) :: v1(3, nn), v2(3, nn), v3(3, nn), director(3, nn)
2377 real(kind=kreal) :: naturalcoord(2), shapefunc(nn), shapederiv(nn, 2)
2378 real(kind=kreal) :: covariant_basis(3, 3), n(3, ndof*nn)
2379 real(kind=kreal) :: zeta, surface_weight, thickness_weight, integration_weight, layer_weight
2380 real(kind=kreal) :: totalmass, totdiag
2383 mass(1:nsize, 1:nsize) = 0.0d0
2384 lumped(1:nsize) = 0.0d0
2389 nlayer = gausses(1)%pMaterial%totallyr
2390 do ilayer = 1, nlayer
2391 layer_weight = gausses(1)%pMaterial%shell_var(ilayer)%weight
2394 if (ierr_quad /= 0) cycle
2401 integration_weight = surface_weight*thickness_weight *shellmitc_covariantjacobian(covariant_basis)*layer_weight
2402 call shellmitc_buildinterpolationmatrix(nn, ndof, zeta, shapefunc, director, n)
2403 mass(1:nsize, 1:nsize) = mass(1:nsize, 1:nsize) + rho*integration_weight*matmul(transpose(n), n)
2404 totalmass = totalmass+rho*integration_weight
2409 totalmass = 3.0d0*totalmass
2413 idof = ndof*(nb-1)+i
2414 totdiag = totdiag+mass(idof, idof)
2419 idof = ndof*(nb-1)+i
2420 lumped(idof) = mass(idof, idof)*totalmass/totdiag
This module encapsulate the basic functions of all elements provide by this software.
subroutine getshapefunc(fetype, localcoord, func)
Calculate the shape function in natural coordinate system.
subroutine getquadpoint(fetype, np, pos)
Fetch the coordinate of gauss point.
subroutine getshapederiv(fetype, localcoord, shapederiv)
Calculate derivatives of shape function in natural coordinate system.
integer function numofshellthicknessquadpoints(etype)
Obtains the number of through-thickness quadrature points of a shell element.
integer, parameter fe_mitc4_shell
integer, parameter fe_mitc9_shell
real(kind=kreal) function getweight(fetype, np)
Fetch the weight value in given gauss point.
integer function numofquadpoints(fetype)
Obtains the number of quadrature points of the element.
integer, parameter fe_mitc3_shell
subroutine getnodalnaturalcoord(fetype, nncoord)
Shared finite-rotation nodal kinematics and rotation algebra.
logical function, public fstr_is_finite_rotation_shell_element(etype, nn)
pure subroutine, public shellrotationvectortomatrix(theta, rotmat)
pure real(kind=kreal) function, dimension(3, 3), public shellskewmatrix(vector)
pure subroutine, public shellcomposerotationvector(theta_old, theta_inc, theta_new)
This module defines common data and basic structures for analysis.
integer(kind=kint), parameter kopss_solution
integer(kind=kint) opsstype
This module manages calculation relates with materials.
subroutine matlmatrix_shell(gauss, sectType, D, e1_hat, e2_hat, e3_hat, cg1, cg2, cg3, alpha, n_layer)
subroutine shellmitc_preparenodalkinematics(etype, nn, thick, kinematics, finite_rotation, use_director_tangent, need_second_tangent, ecoord, nodal_state, ndtriad, ndreftriad, ndcurtriad, evaluation_coords, v1, v2, v3, director, reference_director, director_tangent, director_second_tangent)
Prepare the evaluation coordinates and nodal directors shared by STF/UPDATE.
subroutine, public elementstress_shell_mitc(etype, nn, ndof, ecoord, gausses, edisp, strain, stress, thick, zeta, n_layer, surface_gauss_points, local_strain, local_stress, local_stress_override, ndtriad, ndreftriad, ndbase_disp)
Evaluate MITC shell stress and strain for result output.
subroutine shellmitc_builddrillingsecondvariation(nn, zeta, shapefunc, shapederiv, director_second_tangent, reciprocal_basis, local_basis, use_director_tangent, drilling_second_variation)
Build the director second variation used by the drilling term.
subroutine, public mass_shell(etype, nn, elem, rho, thick, gausses, mass, lumped)
Calculate the consistent and lumped mass matrices of a MITC shell.
subroutine shellmitc_integrateinternalforcelayer(etype, nn, ndof, ilayer, kinematics, finite_rotation, use_director_tangent, use_green_lagrange, update_state, ecoord, evaluation_coords, total_nodal_state, strain_nodal_state, gausses, element, v1, v2, v3, director, reference_director, director_tangent, stress_elem, stress_director, stress_director_increment, nodal_kinematic_dofs, nddrill, qf_work)
Integrate one physical shell layer for stress update and internal force. Only one zeta's tying B matr...
subroutine shellmitc_evaluatetyingpointvariation(etype, nn, ndof, tying_set, tying_point, zeta_tying, elem, shell_disp, director, director_tangent, use_green_lagrange, use_director_tangent, point_B, point_basis_variation, director_second_tangent, point_director_second_variation)
Evaluate one MITC tying point. First and second variations are returned separately so UPDATE can reta...
subroutine shellmitc_covariantbasis(nn, coords, director, zeta, shapefunc, shapederiv, covariant_basis)
Evaluate shell covariant basis vectors at one point.
subroutine shellmitc_setupreferencedirectors(etype, nn, thick, elem, v1, v2, v3, director)
Construct the reference nodal triads and half-thickness directors.
subroutine shellmitc_evaluateassumedstrain(etype, nn, naturalcoord, zeta, elem, edisp, director, director_increment, use_green_lagrange, tying_strain, dstrain, strain_tensor, covariant_basis, reciprocal_basis, material_local_basis, material_reciprocal_basis, reference_basis, current_basis, reference_jacobian, current_jacobian)
Evaluate the MITC assumed strain and stress-evaluation bases at one point.
subroutine, public dl_shell_33(ic_type, nn, ndof, xx, yy, zz, rho, thick, ltype, params, vect, nsize, gausses)
Adapt the natural shell load ordering to shell-solid mixed elements.
subroutine, public update_shell_mitc33(etype, nn, ndof, ecoord, u, du, gausses, qf, thick, mixflag, nddisp)
Linear shell adapter for the split translational/rotational node layout.
pure subroutine shellstressvectortotensor(stress, tensor)
subroutine shellmitc_transformoutput(use_gl_strain, S, E, covariant_basis, reciprocal_basis, reference_basis, current_basis, det_ref, det_cur, strain_out, stress_out)
Transform shell-local stress and strain to the requested output measure.
subroutine, public stf_shell_mitc(etype, nn, ndof, ecoord, gausses, stiff, thick, mixflag, nddisp, element, ndtriad, ndreftriad, ndcurtriad, nddrill)
Calculate the tangent stiffness matrix of a MITC shell element.
subroutine, public dl_shell(etype, nn, ndof, xx, yy, zz, rho, thick, ltype, params, vect, nsize, gausses)
Calculate the distributed load vector of a MITC shell element.
subroutine, public update_shell_mitc(etype, nn, ndof, ecoord, u, du, gausses, qf, thick, mixflag, nddisp, element, ndtriad, ndreftriad, ndcurtriad, nddrill)
Update shell stress and assemble the equivalent nodal force.
This module provides aux functions.
subroutine cross_product(v1, v2, vn)
subroutine get_principal(tensor, eigval, princmatrix)
MITC assumed-strain tying-point rules.
integer function, public numoftyingpoints(etype, iset)
Number of tying points in one tying set.
real(kind=kreal), dimension(6, 2), parameter, public mitc9_eta_sign
subroutine, public gettyingpoint(etype, iset, ip, pos)
Natural coordinate of one MITC tying point.
real(kind=kreal), dimension(6, 2), parameter, public mitc9_xi_sign
Sign patterns used by the MITC9 interpolation polynomials.
integer function, public numoftyingsets(etype)
Number of tying-point sets used by an MITC shell element.
This module summarizes all information of material properties.
integer function getelastictype(mtype)
Get elastic type.
integer(kind=kint), parameter totallag
integer(kind=kint), parameter m_poisson
integer(kind=kint), parameter infinitesimal
character(len=dict_key_length) mc_isoelastic
logical function iselastic(mtype)
If it is an elastic material?
integer(kind=kint), parameter updatelag
This modules defines a structure to record history dependent parameter in static analysis.
subroutine fstr_shell_layer_zeta(gauss, ilayer, zeta, zeta_layer, ierr)
Map layer-local zeta to the whole shell thickness coordinate.
subroutine fstr_shell_layer_quadrature_gauss(etype, gauss, ilayer, ithick, zeta_layer, weight, ierr)
Layer-local shell thickness coordinate and quadrature weight from material status.
integer(kind=kint) function fstr_shell_layer_gauss_index(element, ig, ilayer, ithick)
Convert surface Gauss/layer/thickness indices to shell_layer_gausses index.
All data should be recorded in every elements.
All data should be recorded in every quadrature points.