12 private :: read_user_matl
14 include
'fstr_ctrl_util_f.inc'
22 integer(kind=kint),
intent(in) :: ctrl
23 character(len=*),
intent(out) :: matname
32 integer(kind=kint),
intent(in) :: ctrl
33 integer(kind=kint),
intent(inout) :: mattype
34 integer(kind=kint),
intent(out) :: nlgeom
35 integer(kind=kint),
intent(out) :: nstatus
36 real(kind=kreal),
intent(out) :: matval(:)
38 integer(kind=kint) :: ipt
39 character(len=HECMW_NAME_LEN) :: data_fmt
40 character(len=256) :: s, fname
56 integer(kind=kint),
intent(in) :: ctrl
57 integer(kind=kint),
intent(inout) :: mattype
58 integer(kind=kint),
intent(out) :: nlgeom
59 real(kind=kreal),
intent(out) :: matval(:)
60 type(dict_struct),
pointer :: dict
62 integer(kind=kint) :: i,j, rcode, depends, ipt, n
63 real(kind=kreal),
pointer :: fval(:,:)
64 character(len=HECMW_NAME_LEN) :: data_fmt
67 character(len=256) :: s
72 if( depends>1 ) depends=1
73 if( depends > 3 ) stop
"We cannot read dependencies>3 right now"
84 write(*,*)
"Warning : !ELASTIC : parameter 'INFINITE' is deprecated." &
85 & //
" Please use the replacement parameter 'INFINITESIMAL'"
90 s =
'ISOTROPIC,ORTHOTROPIC,USER '
96 allocate( fval(2+depends,n) )
102 if( depends==1 )
then
110 call init_table( mattable, depends, 2+depends,n, fval )
117 else if( ipt==2 )
then
118 allocate( fval(9+depends,n) )
119 if( depends==0 )
then
120 data_fmt =
"RRRRRRRRR "
123 fval(1,:), fval(2,:), fval(3,:), fval(4,:), fval(5,:), fval(6,:), &
124 fval(7,:), fval(8,:), fval(9,:) )
125 else if( depends==1 )
then
126 data_fmt =
"RRRRRRRRRR "
129 fval(1,:), fval(2,:), fval(3,:), fval(4,:), fval(5,:), fval(6,:), &
130 fval(7,:), fval(8,:), fval(9,:), fval(10,:) )
135 if( fval(1,i)<=0.d0 .or. fval(2,i)<=0.d0 .or. fval(3,i)<=0.d0 .or. &
136 fval(7,i)<=0.d0 .or. fval(8,i)<=0.d0 .or. fval(9,i)<=0.d0 )
then
141 call init_table( mattable, depends, 9+depends,n, fval )
147 else if( ipt==3 )
then
153 stop
"ERROR: Material type not supported"
158 if(
associated(fval) )
deallocate(fval)
165 integer(kind=kint),
intent(in) :: ctrl
166 integer(kind=kint),
intent(inout) :: mattype
167 integer(kind=kint),
intent(out) :: nlgeom
168 real(kind=kreal),
intent(out) :: matval(:)
170 integer(kind=kint) :: i,j, rcode, depends, ipt
171 real(kind=kreal),
pointer :: fval(:,:)
172 character(len=HECMW_NAME_LEN) :: data_fmt
173 character(len=256) :: s
178 if( depends > 3 ) stop
"We cannot read dependencies>3 right now"
184 s =
'NEOHOOKE,MOONEY-RIVLIN,ARRUDA-BOYCE,USER,MOONEY-RIVLIN-ANISO '
189 allocate( fval(2,depends+1) )
191 if( depends==0 )
then
197 if( fval(2,1)==0.d0 ) stop
"We cannot deal with incompressible material currently"
207 else if( ipt==2 )
then
208 allocate( fval(3,depends+1) )
210 if( depends==0 )
then
223 else if( ipt==3 )
then
224 allocate( fval(3,depends+1) )
226 if( depends==0 )
then
238 else if( ipt==4 )
then
243 else if( ipt==5 )
then
244 allocate( fval(10,depends+1) )
246 if( depends==0 )
then
247 data_fmt =
"RRRRRrrrrr "
250 fval(1,:), fval(2,:), fval(3,:), fval(4,:), fval(5,:), &
251 fval(6,:), fval(7,:), fval(8,:), fval(9,:), fval(10,:) )
269 if(
associated(fval) )
deallocate(fval)
276 integer(kind=kint),
intent(in) :: ctrl
277 integer(kind=kint),
intent(inout) :: mattype
278 integer(kind=kint),
intent(out) :: nlgeom
279 type(dict_struct),
pointer :: dict
281 integer(kind=kint) :: i,j, rcode, depends, ipt, n
282 real(kind=kreal),
pointer :: fval(:,:)
283 character(len=HECMW_NAME_LEN) :: data_fmt
284 type(
ttable ) :: mattable
285 character(len=256) :: s
290 if( depends>1 ) depends=1
299 write(*,*)
"Warning : !VISCOELASTIC : parameter 'INFINITE' is deprecated." &
300 & //
" Please use the replacement parameter 'INFINITESIMAL'"
305 s =
'ISOTROPIC,USER '
312 allocate( fval(2+depends,n) )
313 if( depends==0 )
then
317 if( fval(2,1)==0.d0 ) stop
"Error in defining viscoelasticity: Relaxation time cannot be zero!"
319 if( depends==1 )
then
325 call init_table( mattable, 1, 2+depends,n, fval )
332 stop
"ERROR: Material type not supported"
337 if(
associated(fval) )
deallocate(fval)
343 integer(kind=kint),
intent(in) :: ctrl
344 integer(kind=kint),
intent(inout) :: mattype
345 real(kind=kreal),
intent(out) :: matval(:)
348 character(len=256) :: s
357 mattype = mattype+ipt
365 integer(kind=kint),
intent(in) :: ctrl
366 integer(kind=kint),
intent(inout) :: mattype
367 integer(kind=kint),
intent(out) :: nlgeom
368 real(kind=kreal),
intent(out) :: matval(:)
369 real(kind=kreal),
pointer :: mattable(:)
370 type(dict_struct),
pointer :: dict
372 integer(kind=kint) :: i, n, rcode, depends, ipt, hipt
373 real(kind=kreal),
pointer :: fval(:,:) => null()
374 real(kind=kreal) :: phi, psi
375 character(len=HECMW_NAME_LEN) :: data_fmt
376 character(len=256) :: s
378 real(kind=kreal),
parameter :: pi=3.14159265358979d0
385 if( depends>1 ) depends = 1
386 if( depends > 3 ) stop
"We cannot read dependencies>3 right now"
397 write(*,*)
"Warning : !PLASTIC : parameter 'INFINITE' is deprecated." &
398 & //
" Please use the replacement parameter 'INFINITESIMAL'"
406 s =
'BILINEAR,MULTILINEAR,SWIFT,RAMBERG-OSGOOD,KINEMATIC,COMBINED '
412 s =
'MISES,MOHR-COULOMB,DRUCKER-PRAGER,USER '
420 if( hipt==2 .and. n<2 )
return
421 if( ( ipt==2 .or. ipt==3 ) .and. hipt>2 ) hipt = 1
427 allocate( fval(2,n) )
441 allocate( fval(depends+2,n) )
442 if( depends==0 )
then
447 if( fval(2,1)/=0.d0 )
then
448 print *,
"Multilinear hardening: First plastic strain must be zero"
452 if( fval(2,i)<0.0 ) &
453 stop
"Multilinear hardening: Error in plastic strain definition"
455 call init_table( mttable,1, 2+depends, n, fval )
456 call dict_add_key( dict,
mc_yield, mttable )
464 call init_table( mttable,2, 2+depends,n, fval )
465 call dict_add_key( dict,
mc_yield, mttable )
469 allocate( fval(3,1) )
479 print *,
"Error in hardening definition!"
485 allocate( fval(4,n) )
493 phi = fval(2,1)*pi/180.d0
494 if( fval(4,1) >= 0.d0 )
then
495 psi = fval(4,1)*pi/180.d0
502 stop
"Mohr-Coulomb and Drucker-Prager do not support temperature dependency"
504 allocate( fval(2,n) )
510 phi =fval(1,1)*pi/180.d0
511 if( fval(2,1) >= 0.d0 )
then
512 psi = fval(2,1)*pi/180.d0
516 if( fval(2,2)/=0.d0 )
then
517 print *,
"Multilinear hardening: First plastic strain must be zero"
521 if( fval(2,i)<0.0 ) &
522 stop
"Multilinear hardening: Error in plastic strain definition"
524 call init_table( mttable,1, 2, n-1, fval(1:2,2:n) )
525 call dict_add_key( dict,
mc_yield, mttable )
529 matval(
m_plconst3) = 2.d0*sin(phi)/ ( sqrt(3.d0)*(3.d0+sin(phi)) )
530 matval(
m_plconst4) = 6.d0*cos(phi)/ ( sqrt(3.d0)*(3.d0+sin(phi)) )
531 matval(
m_plconst5) = 2.d0*sin(psi)/ ( sqrt(3.d0)*(3.d0+sin(psi)) )
541 stop
"Yield function not supported"
544 if(
associated(fval) )
deallocate(fval)
552 integer(kind=kint),
intent(in) :: ctrl
553 integer(kind=kint),
intent(inout) :: mattype
554 integer(kind=kint),
intent(out) :: nlgeom
555 type(dict_struct),
pointer :: dict
557 integer(kind=kint) :: i,j, rcode, depends, ipt, n
558 real(kind=kreal),
pointer :: fval(:,:)
559 character(len=HECMW_NAME_LEN) :: data_fmt
560 type(
ttable ) :: mattable
561 character(len=256) :: s
566 if( depends>1 ) depends=1
579 allocate( fval(3+depends,n) )
580 if( depends==0 )
then
585 if( depends==1 )
then
591 call init_table( mattable, depends, 3+depends,n, fval )
592 call dict_add_key( dict,
mc_norton, mattable )
598 stop
"ERROR: Material type not supported"
603 if(
associated(fval) )
deallocate(fval)
609 integer(kind=kint),
intent(in) :: ctrl
610 real(kind=kreal),
intent(out) :: matval(:)
612 integer(kind=kint) :: i, rcode, depends
613 real(kind=kreal),
pointer :: fval(:,:)
614 character(len=HECMW_NAME_LEN) :: data_fmt
622 if( depends>1 ) depends = 1
624 allocate( fval(1,depends+1) )
626 data_fmt = data_fmt //
"R "
632 if(
associated(fval) )
deallocate(fval)
640 integer(kind=kint),
intent(in) :: ctrl
641 real(kind=kreal),
intent(out) :: matval(:)
642 type(dict_struct),
pointer :: dict
644 integer(kind=kint) :: i, n, rcode, depends, ipt
645 real(kind=kreal),
pointer :: fval(:,:)
647 character(len=HECMW_NAME_LEN) :: data_fmt, ss
655 ss =
'ISOTROPIC,ORTHOTROPIC '
661 if( depends>1 ) depends = 1
664 allocate( fval(depends+1, n) )
666 data_fmt = data_fmt //
"R "
668 if( depends==0 )
then
677 call init_table( mttable,depends, 1+depends, n, fval )
681 allocate( fval(3+depends,n) )
683 data_fmt = trim(data_fmt) //
"R "
685 if( depends==0 )
then
688 elseif( depends==1 )
then
693 call init_table( mttable, depends, 3+depends,n, fval )
699 if(
associated(fval) )
deallocate(fval)
703 integer function read_user_matl( ctrl, matval )
704 integer(kind=kint),
intent(in) :: ctrl
705 real(kind=kreal),
intent(out) :: matval(:)
707 integer(kind=kint) :: n, i, j
708 real(kind=kreal) :: fval(10,10)
713 if( n > 10 ) stop
"Num of data lines for user-defined material exceeds 10"
716 fval(4,:), fval(5,:), fval(6,:), fval(7,:), fval(8,:), fval(9,:), fval(10,:) ) /= 0 )
return
719 matval((i-1)*10+j)=fval(j,i)
724 end function read_user_matl
729 integer(kind=kint),
intent(in) :: ctrl
730 integer(kind=kint),
intent(inout) :: mattype
731 integer(kind=kint),
intent(out) :: nlgeom
732 real(kind=kreal),
intent(out) :: matval(:)
733 type(dict_struct),
pointer :: dict
735 integer(kind=kint) :: i,j, rcode, depends, ipt, n
736 real(kind=kreal),
pointer :: fval(:,:)
737 character(len=HECMW_NAME_LEN) :: data_fmt
738 type(
ttable ) :: mattable
740 character(len=256) :: s
745 if( depends>1 ) depends=1
746 if( depends > 3 ) stop
"We cannot read dependencies>3 right now"
750 s =
'INCOMP_NEWTONIAN '
756 allocate( fval(1+depends,n) )
757 if( depends==0 )
then
762 if( depends==1 )
then
769 call init_table( mattable, depends, 1+depends,n, fval )
776 stop
"ERROR: Material type not supported"
781 if(
associated(fval) )
deallocate(fval)
787 integer(kind=kint),
intent(in) :: ctrl
788 integer(kind=kint),
intent(inout) :: mattype
789 integer(kind=kint),
intent(out) :: nlgeom
790 integer(kind=kint),
intent(out) :: matval_i(:)
791 type(dict_struct),
pointer :: dict
793 integer(kind=kint) :: i,j, rcode, depends, ipt, n, dof1, dof2
794 real(kind=kreal),
pointer :: fval(:,:)
795 integer(kind=kint),
pointer :: ival(:,:)
796 character(len=HECMW_NAME_LEN) :: data_fmt
797 type(
ttable ) :: mattable
799 character(len=DICT_KEY_LENGTH) :: spkey
808 allocate( fval(1+depends,n), ival(2,n) )
809 if( depends==0 )
then
823 call init_table( mattable, depends, 1+depends, 1, fval(1,i:i) )
825 call dict_add_key( dict, trim(spkey), mattable )
831 if(
associated(fval) )
deallocate(fval)
832 if(
associated(ival) )
deallocate(ival)
838 integer(kind=kint),
intent(in) :: ctrl
839 integer(kind=kint),
intent(inout) :: mattype
840 integer(kind=kint),
intent(out) :: nlgeom
841 integer(kind=kint),
intent(out) :: matval_i(:)
842 type(dict_struct),
pointer :: dict
844 integer(kind=kint) :: i,j, rcode, depends, ipt, n, dof1, dof2
845 real(kind=kreal),
pointer :: fval(:,:)
846 character(len=HECMW_NAME_LEN) :: data_fmt
847 type(
ttable ) :: mattable
849 character(len=DICT_KEY_LENGTH) :: spkey
856 allocate( fval(1+depends,n) )
857 if( depends==0 )
then
869 call init_table( mattable, depends, 1+depends, 1, fval(1,i:i) )
870 write(spkey,
'(A,A)') trim(
mc_spring),
'_A'
871 call dict_add_key( dict, trim(spkey), mattable )
877 if(
associated(fval) )
deallocate(fval)
883 integer(kind=kint),
intent(in) :: ctrl
884 integer(kind=kint),
intent(inout) :: mattype
885 integer(kind=kint),
intent(out) :: nlgeom
886 integer(kind=kint),
intent(out) :: matval_i(:)
887 type(dict_struct),
pointer :: dict
889 integer(kind=kint) :: i,j, rcode, depends, ipt, n, dof1, dof2
890 real(kind=kreal),
pointer :: fval(:,:)
891 integer(kind=kint),
pointer :: ival(:,:)
892 character(len=HECMW_NAME_LEN) :: data_fmt
893 type(
ttable ) :: mattable
895 character(len=DICT_KEY_LENGTH) :: spkey
904 allocate( fval(1+depends,n), ival(2,n) )
905 if( depends==0 )
then
919 call init_table( mattable, depends, 1+depends, 1, fval(1,i:i) )
921 call dict_add_key( dict, trim(spkey), mattable )
927 if(
associated(fval) )
deallocate(fval)
928 if(
associated(ival) )
deallocate(ival)
934 integer(kind=kint),
intent(in) :: ctrl
935 integer(kind=kint),
intent(inout) :: mattype
936 integer(kind=kint),
intent(out) :: nlgeom
937 integer(kind=kint),
intent(out) :: matval_i(:)
938 type(dict_struct),
pointer :: dict
940 integer(kind=kint) :: i,j, rcode, depends, ipt, n, dof1, dof2
941 real(kind=kreal),
pointer :: fval(:,:)
942 character(len=HECMW_NAME_LEN) :: data_fmt
943 type(
ttable ) :: mattable
945 character(len=DICT_KEY_LENGTH) :: spkey
952 allocate( fval(1+depends,n) )
953 if( depends==0 )
then
965 call init_table( mattable, depends, 1+depends, 1, fval(1,i:i) )
967 call dict_add_key( dict, trim(spkey), mattable )
973 if(
associated(fval) )
deallocate(fval)