1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
!
! CalculiX - A 3-dimensional finite element program
! Copyright (C) 1998-2015 Guido Dhondt
!
! This program is free software; you can redistribute it and/or
! modify it under the terms of the GNU General Public License as
! published by the Free Software Foundation(version 2);
!
!
! This program is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with this program; if not, write to the Free Software
! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
!
subroutine springs(inpc,textpart,nelcon,nmat,ntmat_,npmat_,
& plicon,nplicon,
& ncmat_,elcon,matname,irstrt,istep,istat,n,iline,ipol,
& inl,ipoinp,inp,nmat_,set,istartset,iendset,ialset,
& nset,ielmat,ielorien,ipoinpc,mi)
!
! reading the input deck: *SPRING
!
implicit none
!
logical linear
!
character*1 inpc(*)
character*80 matname(*)
character*81 set(*),elset
character*132 textpart(16)
!
integer mi(*),nelcon(2,*),nmat,ntmat_,ntmat,npmat_,npmat,istep,
& n,key,i,nplicon(0:ntmat_,*),ncmat_,istat,istartset(*),
& iendset(*),irstrt,iline,ipol,inl,ipoinp(2,*),inp(3,*),nmat_,
& ialset(*),ipos,nset,j,k,ielmat(mi(3),*),ielorien(mi(3),*),
& ipoinpc(0:*)
!
real*8 plicon(0:2*npmat_,ntmat_,*),temperature,
& elcon(0:ncmat_,ntmat_,*)
!
linear=.true.
!
ntmat=0
npmat=0
!
if((istep.gt.0).and.(irstrt.ge.0)) then
write(*,*) '*ERROR reading *SPRING: *SPRING should be placed'
write(*,*) ' before all step definitions'
call exit(201)
endif
!
nmat=nmat+1
if(nmat.gt.nmat_) then
write(*,*) '*ERROR reading *SPRING: increase nmat_'
call exit(201)
endif
matname(nmat)(1:6)='SPRING'
do i=7,80
matname(nmat)(i:i)=' '
enddo
!
do i=2,n
if(textpart(i)(1:9).eq.'NONLINEAR') then
linear=.false.
elseif(textpart(i)(1:6).eq.'ELSET=') then
elset=textpart(i)(7:86)
elset(81:81)=' '
ipos=index(elset,' ')
elset(ipos:ipos)='E'
else
write(*,*)
& '*WARNING reading *SPRING: parameter not recognized:'
write(*,*) ' ',
& textpart(i)(1:index(textpart(i),' ')-1)
call inputwarning(inpc,ipoinpc,iline,
&"*SPRING%")
endif
enddo
!
if(linear) then
nelcon(1,nmat)=2
!
! linear spring
!
do
call getnewline(inpc,textpart,istat,n,key,iline,ipol,inl,
& ipoinp,inp,ipoinpc)
if((istat.lt.0).or.(key.eq.1)) exit
ntmat=ntmat+1
nelcon(2,nmat)=ntmat
if(ntmat.gt.ntmat_) then
write(*,*) '*ERROR reading *SPRING: increase ntmat_'
call exit(201)
endif
do i=1,2
read(textpart(i)(1:20),'(f20.0)',iostat=istat)
& elcon(i,ntmat,nmat)
if(istat.gt.0) call inputerror(inpc,ipoinpc,iline,
&"*SPRING%")
enddo
if(textpart(3)(1:1).ne.' ') then
read(textpart(3)(1:20),'(f20.0)',iostat=istat)
& elcon(0,ntmat,nmat)
if(istat.gt.0) call inputerror(inpc,ipoinpc,iline,
&"*SPRING%")
else
elcon(0,ntmat,nmat)=0.d0
endif
enddo
else
nelcon(1,nmat)=-51
!
! kinematic hardening coefficients
!
do
call getnewline(inpc,textpart,istat,n,key,iline,ipol,inl,
& ipoinp,inp,ipoinpc)
if((istat.lt.0).or.(key.eq.1)) exit
read(textpart(3)(1:20),'(f20.0)',iostat=istat) temperature
if(istat.gt.0) call inputerror(inpc,ipoinpc,iline,
&"*SPRING%")
!
! first temperature
!
if(ntmat.eq.0) then
npmat=0
ntmat=ntmat+1
if(ntmat.gt.ntmat_) then
write(*,*) '*ERROR reading *SPRING: increase ntmat_'
call exit(201)
endif
nplicon(0,nmat)=ntmat
plicon(0,ntmat,nmat)=temperature
!
! new temperature
!
elseif(plicon(0,ntmat,nmat).ne.temperature) then
npmat=0
ntmat=ntmat+1
if(ntmat.gt.ntmat_) then
write(*,*) '*ERROR reading *SPRING: increase ntmat_'
call exit(201)
endif
nplicon(0,nmat)=ntmat
plicon(0,ntmat,nmat)=temperature
endif
do i=1,2
read(textpart(i)(1:20),'(f20.0)',iostat=istat)
& plicon(2*npmat+i,ntmat,nmat)
if(istat.gt.0) call inputerror(inpc,ipoinpc,iline,
&"*SPRING%")
enddo
npmat=npmat+1
if(npmat.gt.npmat_) then
write(*,*) '*ERROR reading *SPRING: increase npmat_'
call exit(201)
endif
nplicon(ntmat,nmat)=npmat
enddo
endif
!
if(ntmat.eq.0) then
write(*,*) '*ERROR reading *SPRING: *SPRING card without data'
call exit(201)
endif
do i=1,nset
if(set(i).eq.elset) exit
enddo
if(i.gt.nset) then
elset(ipos:ipos)=' '
write(*,*) '*ERROR reading *SPRING: element set ',elset
write(*,*) ' has not yet been defined. '
call inputerror(inpc,ipoinpc,iline,
&"*SPRING%")
call exit(201)
endif
!
! assigning the elements of the set the appropriate material
!
do j=istartset(i),iendset(i)
if(ialset(j).gt.0) then
ielmat(1,ialset(j))=nmat
ielorien(1,ialset(j))=0
else
k=ialset(j-2)
do
k=k-ialset(j)
if(k.ge.ialset(j-1)) exit
ielmat(1,k)=nmat
ielorien(1,k)=0
enddo
endif
enddo
!
return
end
|