18 integer,
intent(in) :: sectType
19 real(kind=
kreal),
intent(out) :: d(:,:)
20 real(kind=
kreal),
intent(in) :: temp
21 real(kind=
kreal) :: ee, pp, coef1, coef2, ina(1), outa(2)
22 integer(kind=kint),
intent(in),
optional :: hdflag
24 real(kind=
kreal) :: k, g
29 call fetch_tabledata(
mc_isoelastic, matl%dict, outa, ierr, ina )
38 select case (secttype)
40 k = ee/(1.d0-2.d0*pp)/3.d0
41 g = ee/(1.d0+pp)*0.5d0
42 if(
present(hdflag) )
then
43 if( hdflag == 1 ) k = 0.d0
44 if( hdflag == 2 ) g = 0.d0
46 d(1,1)=k+(4.d0/3.d0)*g
47 d(1,2)=k-(2.d0/3.d0)*g
71 coef1=ee/((1.d0+pp)*(1.d0-2.d0*pp))
72 coef2=ee/(2.d0*(1.d0+pp))
73 d(1,1)=coef1*(1.d0-pp)
83 coef1=ee*(1.d0-pp)/((1.d0+pp)*(1.d0-2.d0*pp))
84 coef2=(1.d0-2.d0*pp)/(2.d0*(1.d0-pp))
86 d(1,2)=coef1*pp/(1.d0-pp)
102 stop
"Section type not defined"
115 integer,
intent(in) :: secttype
116 real(kind=
kreal),
intent(in) :: bij(3,3)
117 real(kind=
kreal),
intent(out) :: dmat(:,:)
118 real(kind=
kreal),
intent(in) :: temp
119 integer(kind=kint),
intent(in),
optional :: hdflag
120 real(kind=
kreal) :: e1, e2, e3, g12, g23, g13, nyu12, nyu23,nyu13
121 real(kind=
kreal) :: nyu21,nyu32,nyu31, delta1, ina(1), outa(9)
122 real(kind=
kreal) :: tm(6,6)
123 real(kind=
kreal) :: cvol, dvol(6,6), amat(6,6), uvec(6)
130 stop
"Fails in fetching orthotropic elastic constants!"
145 delta1 = 1.d0/(1.d0 -nyu12*nyu21 -nyu23*nyu32 -nyu31*nyu13 -2.d0*nyu21*nyu32*nyu13)
148 dmat(1,1) = e1*(1.d0-nyu23*nyu32)*delta1
149 dmat(2,2) = e2*(1.d0-nyu13*nyu31)*delta1
150 dmat(3,3) = e3*(1.d0-nyu12*nyu21)*delta1
151 dmat(1,2) = e1*(nyu21+nyu31*nyu23)*delta1
152 dmat(1,3) = e1*(nyu31+nyu21*nyu32)*delta1
153 dmat(2,3) = e2*(nyu32+nyu12*nyu31)*delta1
158 dmat(2,1) = dmat(1,2)
159 dmat(3,2) = dmat(2,3)
160 dmat(3,1) = dmat(1,3)
164 dmat = matmul( transpose(tm), dmat)
165 dmat = matmul( dmat, (tm) )
168 if(
present(hdflag) )
then
169 if( hdflag == 1 .or. hdflag == 2 )
then
170 amat(:,:) = dmat(:,:)
171 uvec(:) = 0.d0; uvec(1) = 1.d0; uvec(2) = 1.d0; uvec(3) = 1.d0
173 cvol = 1.d0 / (uvec(1) + uvec(2) + uvec(3))
180 if( hdflag == 1 )
then
181 dmat(:,:) = dmat(:,:) - dvol(:,:)
182 else if( hdflag == 2 )
then
183 dmat(:,:) = dvol(:,:)
193 (matl, secttype, c, &
194 e1_hat, e2_hat, e3_hat, cg1, cg2, cg3, &
195 alpha, n_layer, cdsys)
199 integer,
intent(in) :: sectType, n_layer
200 real(kind =
kreal),
intent(out) :: c(:, :, :, :)
201 real(kind =
kreal),
intent(in) :: e1_hat(3), e2_hat(3), e3_hat(3)
202 real(kind =
kreal),
intent(in) :: cg1(3), cg2(3), cg3(3)
203 real(kind =
kreal),
intent(out) :: alpha
204 real(kind =
kreal),
intent(in),
optional :: cdsys(3, 3)
208 real(kind =
kreal) :: ee, pp, ee2, g12, g23, g31, theta, pp2
209 real(kind =
kreal) :: outa(2)
210 real(kind =
kreal) :: lambda1, lambda2, mu, k_correction, r44, r55
211 real(kind =
kreal) :: c_hat(3, 3, 3, 3), d(5,5), d_hat(5,5), d_temp(5,5), t(5,5)
212 real(kind =
kreal) :: e_hat_dot_cg(3, 3)
213 real(kind =
kreal) :: alpha_over_mu
214 real(kind =
kreal) :: v_ref(3), v_proj(3), v_proj_abs
215 real(kind =
kreal) :: v_ref_y(3), v_sense
216 real(kind =
kreal) :: theta_ref, phi, c_ref, s_ref, c_phi, s_phi
217 real(kind =
kreal) :: d44_ref, d45_ref, d55_ref
219 integer :: index_i(5), index_j(5), index_k(5), index_l(5)
220 integer :: is, js, ii, ij, ik, il
221 integer :: i, j, k, l, total_layer, matl_type
231 matl_type = matl%shell_var(n_layer)%ortho
232 if(matl_type == 0)
then
235 ee = matl%shell_var(n_layer)%ee
236 pp = matl%shell_var(n_layer)%pp
250 lambda1 = ee/( 1.0d0-pp*pp )
252 mu = 0.5d0*ee/( 1.0d0+pp )
257 k_correction = 5.0d0/6.0d0
267 alpha = alpha_over_mu*mu
272 c_hat(:, :, :, :) = 0.0d0
276 c_hat(1, 1, 1, 1) = lambda1
277 c_hat(1, 1, 2, 2) = lambda2
278 c_hat(2, 2, 1, 1) = lambda2
279 c_hat(2, 2, 2, 2) = lambda1
280 c_hat(1, 2, 1, 2) = mu
281 c_hat(1, 2, 2, 1) = mu
282 c_hat(2, 1, 1, 2) = mu
283 c_hat(2, 1, 2, 1) = mu
284 c_hat(1, 3, 1, 3) = k_correction*mu*r55
285 c_hat(1, 3, 3, 1) = k_correction*mu*r55
286 c_hat(2, 3, 2, 3) = k_correction*mu*r44
287 c_hat(2, 3, 3, 2) = k_correction*mu*r44
288 c_hat(3, 1, 3, 1) = k_correction*mu*r55
289 c_hat(3, 1, 1, 3) = k_correction*mu*r55
290 c_hat(3, 2, 3, 2) = k_correction*mu*r44
291 c_hat(3, 2, 2, 3) = k_correction*mu*r44
295 elseif(matl_type == 1)
then
296 total_layer = matl%totallyr
298 ee = matl%shell_var(n_layer)%ee
299 pp = matl%shell_var(n_layer)%pp
300 ee2 = matl%shell_var(n_layer)%ee2
301 g12 = matl%shell_var(n_layer)%g12
302 g23 = matl%shell_var(n_layer)%g23
303 g31 = matl%shell_var(n_layer)%g31
304 theta = matl%shell_var(n_layer)%angle
308 if(
present(cdsys) ) v_ref(1:3) = cdsys(1, 1:3)
309 if(
present(cdsys) ) v_ref_y(1:3) = cdsys(2, 1:3)
310 v_proj(1:3) = v_ref(1:3) - dot_product(v_ref, e3_hat) * e3_hat(1:3)
311 v_proj_abs = dsqrt( dot_product(v_proj, v_proj) )
312 v_sense = dot_product(v_proj, e1_hat) * dot_product(v_ref_y, e2_hat) &
313 - dot_product(v_proj, e2_hat) * dot_product(v_ref_y, e1_hat)
316 theta_ref = sign(1.0d0, v_sense) * theta
317 phi = datan2( dot_product(v_proj, e2_hat), dot_product(v_proj, e1_hat) )
318 theta = theta_ref + phi
325 k_correction = 5.0d0/6.0d0
332 alpha = alpha_over_mu * 0.5d0 * ee / ( 1.0d0+pp )
345 d(1,1) = ee / (1.0d0 - pp * pp2)
346 d(1,2) = pp2 * ee / (1.0d0- pp * pp2)
347 d(2,1) = pp2 * ee / (1.0d0- pp * pp2)
348 d(2,2) = ee2 / (1.0d0 - pp * pp2)
350 d(4,4) = k_correction * g23
351 d(5,5) = k_correction * g31
353 t(1,1) = cos(theta) * cos(theta)
354 t(1,2) = sin(theta) * sin(theta)
355 t(2,1) = sin(theta) * sin(theta)
356 t(2,2) = cos(theta) * cos(theta)
357 t(3,3) = cos(theta) * cos(theta) - sin(theta) * sin(theta)
358 t(1,3) = sin(theta) * cos(theta)
359 t(2,3) = -sin(theta) * cos(theta)
360 t(3,1) = -2.0d0 * sin(theta) * cos(theta)
361 t(3,2) = 2.0d0 * sin(theta) * cos(theta)
369 d_temp(1,1) = d(1,1)*t(1,1)+d(1,2)*t(2,1)
370 d_temp(1,2) = d(1,1)*t(1,2)+d(1,2)*t(2,2)
371 d_temp(2,1) = d(2,1)*t(1,1)+d(2,2)*t(2,1)
372 d_temp(2,2) = d(2,1)*t(1,2)+d(2,2)*t(2,2)
373 d_temp(3,1) = d(3,3)*t(3,1)
374 d_temp(3,2) = d(3,3)*t(3,2)
375 d_temp(1,3) = d(1,1)*t(1,3)+d(1,2)*t(2,3)
376 d_temp(2,3) = d(2,1)*t(1,3)+d(2,2)*t(2,3)
377 d_temp(3,3) = d(3,3)*t(3,3)
378 d_temp(4,4) = d(4,4)*t(4,4)
379 d_temp(4,5) = d(4,4)*t(4,5)
380 d_temp(5,4) = d(5,5)*t(5,4)
381 d_temp(5,5) = d(5,5)*t(5,5)
385 d_hat(1,1) = t(1,1)*d_temp(1,1)+t(1,2)*d_temp(2,1)+t(3,1)*d_temp(3,1)
386 d_hat(1,2) = t(1,1)*d_temp(1,2)+t(1,2)*d_temp(2,2)+t(3,1)*d_temp(3,2)
387 d_hat(2,1) = t(2,1)*d_temp(1,1)+t(2,2)*d_temp(2,1)+t(3,2)*d_temp(3,1)
388 d_hat(2,2) = t(2,1)*d_temp(1,2)+t(2,2)*d_temp(2,2)+t(3,2)*d_temp(3,2)
389 d_hat(3,1) = t(1,3)*d_temp(1,1)+t(2,3)*d_temp(2,1)+t(3,3)*d_temp(3,1)
390 d_hat(3,2) = t(1,3)*d_temp(1,2)+t(2,3)*d_temp(2,2)+t(3,3)*d_temp(3,2)
391 d_hat(1,3) = t(1,1)*d_temp(1,3)+t(1,2)*d_temp(2,3)+t(3,1)*d_temp(3,3)
392 d_hat(2,3) = t(2,1)*d_temp(1,3)+t(2,2)*d_temp(2,3)+t(3,2)*d_temp(3,3)
393 d_hat(3,3) = t(1,3)*d_temp(1,3)+t(2,3)*d_temp(2,3)+t(3,3)*d_temp(3,3)
394 d_hat(4,4) = t(4,4)*d_temp(4,4)+t(5,4)*d_temp(5,4)
395 d_hat(4,5) = t(4,4)*d_temp(4,5)+t(5,4)*d_temp(5,5)
396 d_hat(5,4) = t(4,5)*d_temp(4,4)+t(5,5)*d_temp(5,4)
397 d_hat(5,5) = t(4,5)*d_temp(4,5)+t(5,5)*d_temp(5,5)
401 c_ref = cos(theta_ref)
402 s_ref = sin(theta_ref)
403 d44_ref = r44 * ( c_ref * c_ref * d(4,4) + s_ref * s_ref * d(5,5) )
404 d45_ref = sqrt(r44 * r55) * c_ref * s_ref * ( d(5,5) - d(4,4) )
405 d55_ref = r55 * ( s_ref * s_ref * d(4,4) + c_ref * c_ref * d(5,5) )
409 d_hat(4,4) = c_phi * c_phi * d44_ref + 2.0d0 * c_phi * s_phi * d45_ref + s_phi * s_phi * d55_ref
410 d_hat(4,5) = c_phi * s_phi * ( d55_ref - d44_ref ) + ( c_phi * c_phi - s_phi * s_phi ) * d45_ref
411 d_hat(5,4) = d_hat(4,5)
412 d_hat(5,5) = s_phi * s_phi * d44_ref - 2.0d0 * c_phi * s_phi * d45_ref + c_phi * c_phi * d55_ref
417 c_hat(:, :, :, :) = 0.0d0
456 c_hat(ii, ij, ik, il) = d_hat(is, js)
457 c_hat(ij, ii, ik, il) = d_hat(is, js)
458 c_hat(ii, ij, il, ik) = d_hat(is, js)
459 c_hat(ij, ii, il, ik) = d_hat(is, js)
468 write(*,*)
'shell matl type isnot collect'
473 select case( secttype )
477 = e1_hat(1)*cg1(1)+e1_hat(2)*cg1(2) &
480 = e2_hat(1)*cg1(1)+e2_hat(2)*cg1(2) &
482 e_hat_dot_cg(3, 1) = 0.0d0
484 = e1_hat(1)*cg2(1)+e1_hat(2)*cg2(2) &
487 = e2_hat(1)*cg2(1)+e2_hat(2)*cg2(2) &
489 e_hat_dot_cg(3, 2) = 0.0d0
491 = e1_hat(1)*cg3(1)+e1_hat(2)*cg3(2) &
494 = e2_hat(1)*cg3(1)+e2_hat(2)*cg3(2) &
497 = e3_hat(1)*cg3(1)+e3_hat(2)*cg3(2) &
504 c(1, 1, 1, 1) = 0.0d0
505 c(2, 2, 1, 1) = 0.0d0
506 c(1, 2, 1, 1) = 0.0d0
507 c(2, 2, 2, 2) = 0.0d0
508 c(1, 2, 2, 2) = 0.0d0
509 c(1, 2, 1, 2) = 0.0d0
510 c(3, 1, 1, 1) = 0.0d0
511 c(3, 1, 2, 2) = 0.0d0
512 c(3, 1, 1, 2) = 0.0d0
513 c(2, 3, 1, 1) = 0.0d0
514 c(2, 3, 2, 2) = 0.0d0
515 c(2, 3, 1, 2) = 0.0d0
516 c(3, 1, 3, 1) = 0.0d0
517 c(3, 1, 2, 3) = 0.0d0
518 c(2, 3, 2, 3) = 0.0d0
531 *e_hat_dot_cg(i, 1)*e_hat_dot_cg(j ,1) &
532 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 1)
536 *e_hat_dot_cg(i, 2)*e_hat_dot_cg(j, 2) &
537 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 1)
541 *e_hat_dot_cg(i, 1)*e_hat_dot_cg(j, 2) &
542 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 1)
546 *e_hat_dot_cg(i, 2)*e_hat_dot_cg(j, 2) &
547 *e_hat_dot_cg(k, 2)*e_hat_dot_cg(l, 2)
552 *e_hat_dot_cg(i, 1)*e_hat_dot_cg(j, 2) &
553 *e_hat_dot_cg(k, 2)*e_hat_dot_cg(l, 2)
557 *e_hat_dot_cg(i, 1)*e_hat_dot_cg(j, 2) &
558 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 2)
567 *e_hat_dot_cg(i, 3)*e_hat_dot_cg(j, 1) &
568 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 1)
572 *e_hat_dot_cg(i, 3)*e_hat_dot_cg(j, 1) &
573 *e_hat_dot_cg(k, 2)*e_hat_dot_cg(l, 2)
577 *e_hat_dot_cg(i, 3)*e_hat_dot_cg(j, 1) &
578 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 2)
591 *e_hat_dot_cg(i, 2)*e_hat_dot_cg(j, 3) &
592 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 1)
596 *e_hat_dot_cg(i, 2)*e_hat_dot_cg(j, 3) &
597 *e_hat_dot_cg(k, 2)*e_hat_dot_cg(l, 2)
601 *e_hat_dot_cg(i, 2)*e_hat_dot_cg(j, 3) &
602 *e_hat_dot_cg(k, 1)*e_hat_dot_cg(l, 2)
619 *e_hat_dot_cg(i, 3)*e_hat_dot_cg(j, 1) &
620 *e_hat_dot_cg(k, 3)*e_hat_dot_cg(l, 1)
641 *e_hat_dot_cg(i, 3)*e_hat_dot_cg(j, 1) &
642 *e_hat_dot_cg(k, 2)*e_hat_dot_cg(l, 3)
655 *e_hat_dot_cg(i, 2)*e_hat_dot_cg(j, 3) &
656 *e_hat_dot_cg(k, 2)*e_hat_dot_cg(l, 3)
666 c(1, 1, 2, 2) = c(2, 2, 1, 1)
667 c(1, 1, 1, 2) = c(1, 2, 1, 1)
668 c(1, 1, 2, 3) = c(2, 3, 1, 1)
669 c(1, 1, 3, 1) = c(3, 1, 1, 1)
670 c(2, 2, 1, 2) = c(1, 2, 2, 2)
671 c(2, 2, 2, 3) = c(2, 3, 2, 2)
672 c(2, 2, 3, 1) = c(3, 1, 2, 2)
673 c(1, 2, 2, 3) = c(2, 3, 1, 2)
674 c(1, 2, 3, 1) = c(3, 1, 1, 2)
675 c(2, 3, 3, 1) = c(3, 1, 2, 3)
737 real(kind =
kreal),
intent(out) :: r44, r55
739 real(kind =
kreal) :: e_layer(2, matl%totallyr), g_layer(2, matl%totallyr)
740 real(kind =
kreal) :: ee, pp, pp2, k_correction, ratio(2)
741 real(kind =
kreal) :: zb, zt, zn, z, ea, es, d_bend, g_bot, g_pt, gg_int, gt_sum
742 real(kind =
kreal) :: gauss_xi(3), gauss_w(3)
743 real(kind =
kreal) :: q11, q22, q12h, cs, sn
744 integer :: nlyr, idir, i, ip
749 if( nlyr <= 1 )
return
751 k_correction = 5.0d0/6.0d0
752 gauss_xi = (/ -sqrt(0.6d0), 0.0d0, sqrt(0.6d0) /)
753 gauss_w = (/ 5.0d0/9.0d0, 8.0d0/9.0d0, 5.0d0/9.0d0 /)
756 ee = matl%shell_var(i)%ee
757 pp = matl%shell_var(i)%pp
758 if( matl%shell_var(i)%ortho == 1 )
then
759 pp2 = pp * matl%shell_var(i)%ee2 / ee
760 q11 = ee / (1.0d0 - pp * pp2)
761 q22 = matl%shell_var(i)%ee2 / (1.0d0 - pp * pp2)
762 q12h = 2.0d0 * (pp2 * q11 + 2.0d0 * matl%shell_var(i)%g12)
763 cs = cos( matl%shell_var(i)%angle )
764 sn = sin( matl%shell_var(i)%angle )
765 e_layer(1, i) = sn**4 * q11 + cs**2 * sn**2 * q12h + cs**4 * q22
766 e_layer(2, i) = cs**4 * q11 + cs**2 * sn**2 * q12h + sn**4 * q22
767 g_layer(1, i) = cs**2 * matl%shell_var(i)%g23 + sn**2 * matl%shell_var(i)%g31
768 g_layer(2, i) = sn**2 * matl%shell_var(i)%g23 + cs**2 * matl%shell_var(i)%g31
770 e_layer(:, i) = ee / (1.0d0 - pp * pp)
771 g_layer(:, i) = 0.5d0 * ee / (1.0d0 + pp)
778 if( any( g_layer(idir, :) <= 0.0d0 ) ) cycle
784 zt = zb + matl%shell_var(i)%weight
785 ea = ea + e_layer(idir, i) * (zt - zb)
786 es = es + e_layer(idir, i) * 0.5d0 * (zt * zt - zb * zb)
789 if( ea <= 0.0d0 ) cycle
798 zt = zb + matl%shell_var(i)%weight
799 d_bend = d_bend + e_layer(idir, i) * ((zt - zn)**3 - (zb - zn)**3) / 3.0d0
801 z = 0.5d0 * (zb + zt) + 0.5d0 * (zt - zb) * gauss_xi(ip)
802 g_pt = g_bot + 0.5d0 * e_layer(idir, i) * ((z - zn)**2 - (zb - zn)**2)
803 gg_int = gg_int + 0.5d0 * (zt - zb) * gauss_w(ip) * g_pt * g_pt / g_layer(idir, i)
805 g_bot = g_bot + 0.5d0 * e_layer(idir, i) * ((zt - zn)**2 - (zb - zn)**2)
806 gt_sum = gt_sum + g_layer(idir, i) * (zt - zb)
809 if( gg_int > 0.0d0 ) ratio(idir) = d_bend * d_bend / gg_int / (k_correction * gt_sum)
integer(kind=4), parameter kreal
This module provides functions for elastic material.
subroutine linearelastic_shell(matl, sectType, c, e1_hat, e2_hat, e3_hat, cg1, cg2, cg3, alpha, n_layer, cdsys)
subroutine calelasticmatrix(matl, sectType, D, temp, hdflag)
Calculate isotropic elastic matrix hdflag: 0=full, 1=deviatoric only (edge-smoothed,...
subroutine shelltransshearratio(matl, r44, r55)
Ratio of the energy-equivalent transverse shear stiffness D**2/int(g**2/G dz) of a laminate,...
subroutine calelasticmatrix_ortho(matl, sectType, bij, DMAT, temp, hdflag)
Calculate orthotropic elastic matrix bij: rotation matrix from material axes to global axes,...
This module provides aux functions.
subroutine calsolve(NN, A, b)
Solve A x = b for dense NN x NN system (Gaussian elimination with partial pivoting)
subroutine transformation(jacob, tm)
This module summarizes all information of material properties.
integer(kind=kint), parameter m_youngs
integer(kind=kint), parameter planestress
integer(kind=kint), parameter d3
integer(kind=kint), parameter planestrain
integer(kind=kint), parameter shell
integer(kind=kint), parameter m_poisson
integer(kind=kint), parameter axissymetric
character(len=dict_key_length) mc_isoelastic
character(len=dict_key_length) mc_orthoelastic
integer(kind=kint), parameter m_alpha_over_mu
Structure to manage all material related data.