FEAP User Forum
FEAP => Programming => Topic started by: wklausler on July 13, 2020, 07:51:52 AM
-
Dear FEAP programmers,
I am interested in including the BACK command in my user package for FEAP 8.4. Within the BACK subroutine autbac.f, there is a loop over the problem partitions. For each partition, the values of the displacement solution terms of the partition DOFs are 'backed up' using the velocities, in the subroutine update.f.
ub = u(i,n,2)*cc
j = eq(i,n)
c Compute values from current solution
if (j.gt.0) then
u(i,n,1) = u(i,n,1) - ub
u(i,n,2) = 0.0d0
u(i,n,3) = 0.0d0
c Compute values from forced inputs
else
du(neq-j) = 0.0d0
u(i,n,3) = 0.0d0
u(i,n,2) = 0.0d0
f(i,n,1) = f(i,n,2)
u(i,n,1) = f(i,n,2)
endif
This approach seems to be problematic for problem setups in which DOFs are part of multiple partitions, in which the displacement terms are backed up multiple times. For example, the solution process I am working with involves decoupled and monolithic solutions steps:
PARTition
1 1 1 0
0 0 0 1
1 1 1 1
One solution to this could be to simply loop over all nodes and their DOFs directly, without going through the partitions.
Is my understanding of this correct? What might be some non-obvious implications of changing the update procedure?
Best regards,
wklausler
-
I believe you are correct. Currently, I am trying to just use:
! Back up solution vectors: u(*)
do i = 1,ndf
if(ndfp(i).eq.npart) then
do n = 1,numnp
! Compute values from current solution
u(i,n,1) = u(i,n,1) - u(i,n,2)
u(i,n,2) = 0.0d0
u(i,n,3) = 0.0d0
end do ! n
endif
end do ! i
I think even if it is called more than once it will not matter. Can you test and let us know if this is adequate.
-
Ah, I realize what I've overlooked. Since the nodal velocities are set to 0 at the first pass, any subsequent passes will not result in further changes to the displacements. I will implement and test doing just one pass over all nodes and DOFs.
-
I've removed the call to update.f with isw=3 from autbac.f and replaced the main solution back stepping with the following
do i = 1,numnp
do j = 1,ndf
U(j,i,1) = U(j,i,1) - U(j,i,2)
U(j,i,2) = 0.0d0
U(j,i,3) = 0.0d0
end do ! j
end do ! i
The remaining functionality of update.f, isw=3, has been transferred to the first partition loop in autbac.f. I tested these changes on a typical mechanical example and on a decoupled thermomechanical example, and the displacement results match, which (for now) is sufficient for my uses. The modified autbac.f is attached, albeit with an extra change for my package.
-
Seems just changing the parts changing u(:,:,:) in pupdate would do the same? If the same dof's are affected nothing happens the second time. Is there something that IS different?