! user amplitude subroutine
subroutine VUAMP(
* ampName, time, ampValueOld, dt, nprops, props, nSvars,
* svars, lFlagsInfo, nSensor, sensorValues, sensorNames,
* jSensorLookUpTable,
* AmpValueNew,
* lFlagsDefine,
* AmpDerivative, AmpSecDerivative, AmpIncIntegral)
include 'VABA_PARAM.INC'
! time indices
parameter (iStepTime = 1,
* iTotalTime = 2,
* nTime = 2)
! flags passed in for information
parameter (iInitialization = 1,
* iRegularInc = 2,
* ikStep = 3,
* nFlagsInfo = 3)
! optional flags to be defined
parameter (iComputeDeriv = 1,
* iComputeSecDeriv = 2,
* iComputeInteg = 3,
* iStopAnalysis = 4,
* iConcludeStep = 5,
* nFlagsDefine = 5)
dimension time(nTime), lFlagsInfo(nFlagsInfo),
* lFlagsDefine(nFlagsDefine),
* sensorValues(nSensor),
* props(nprops),
* sVars(nSvars)
character*80 sensorNames(nSensor)
character*80 ampName
dimension jSensorLookUpTable(*)
! -----------------------------------------------------------------------------------
character*256 FILE_ACT, FILE_XM, FILE_XM_OUT
real(8) svars
real(8) a0, b0, c0, d0, p0, g1, g2, Kse
real(8) xm_init, xce_init
real(8) A, xce, xm, F, Fc, F_old
real(8) xce_r, dxdt
real(8) d_xm, d_xce, d_se, xse
real(8) gain_length, dt_NEURON
character*255 jobname,outdir
character(len=:), allocatable :: cwd, cmd, cmd2
integer :: rc, rc2
! -----------------------------------------------------------------------------------
a0 = 2.35 ![N]
b0 = 24.35 ![mm*s-1]
c0 = -7.4 ![N]
d0 = 30.3 ![mm*s-1]
p0 = 23 ![N]
g1 = -8 ![mm]
g2 = 21.4 ![mm]
Kse = 0.4 ![mm-1]
xm_init = -8.0 ![mm]
xce_init = -8 ![mm]
dt_NEURON = 0.025 ![ms]
call vgetjobname(jobname,lenjobname)
call vgetoutdir(outdir,lenoutdir)
if (lFlagsInfo(iInitialization).eq.1) then
! Clear cmd cache, compile NEURON .mod files and run NEURON job
cwd = outdir(1:lenoutdir)
cmd = 'ipconfig/flushdns && cd '//trim(outdir)//' && nrnivmodl && python Kim_Model.py'
rc = system(cmd)
ampValueNew = ampValueOld
svars(1) = ampValueNew
svars(2) = 0.0 !Will be used to track ampValueNew that is input back to Abaqus
svars(3) = 0.0 !Tracker for when to call next NEURON simulation
svars(10) = 3999.0 !Tracker for reading values in from file
A = 0.0
xm = xm_init
F = 0.00001
svars(13) = xce_init
else
! After Abaqus has ran for 100ms, call NEURON to run next simulation
if (svars(3) .eq. 3999) then
cmd2 = 'ipconfig/flushdns'
rc = system(cmd2)
cwd = outdir(1:lenoutdir)
!cmd = 'ipconfig/flushdns && cd '//trim(outdir)//' && python Kim_Model_restore.py'
cmd = 'cd '//trim(outdir)//' && python Kim_Model_restore.py'
rc = system(cmd)
svars(3) = 0.0
end if
! Read in activation (mgi) and muscle length (cli) from Module1_2.mod in NEURON
FILE_ACT=trim(outdir)//'\mgi_output_results.txt'
OPEN(UNIT=111, FILE=FILE_ACT, STATUS='UNKNOWN', action='READ', access='SEQUENTIAL')
FILE_XM=trim(outdir)//'\cli_output_results.txt'
OPEN(UNIT=112, FILE=FILE_XM, STATUS='UNKNOWN', action='READ', access='SEQUENTIAL')
read(111,'(F18.8)') svars(5) ! Activation
read(112,'(F5.0)') svars(6) ! xm
A = svars(5)
xm = svars(6)
!! Set initial value of F for the calculation of rate of change of xce
!! It should be ampValueOld (previous value of F), unless it was a zero
!! because a zero will cause the force to never change from zero
if (ampValueOld .eq. 0) then
F_old = 0.00001
else
F_old = ampValueOld
end if
!Calculate muscle force from voltage differential / activation
g_xm = exp(-((xm-g1)/g2)**2)
Fc = p0*g_xm*A
if (F_old .le. Fc) then
dxdt = (0.001*(-b0*(Fc-F_old)))/(F_old+(a0*(Fc/p0)))
else
gain_length = (-d0*(Fc-F_old))/((2*Fc)-F_old+(c0*Fc/p0))
if (gain_length .le. 0) then
dxdt = 100
else
dxdt = 0.001*gain_length
end if
end if
xce = svars(13) - (dt_NEURON*(-dxdt))
d_xm = xm - xm_init
d_xce = xce - xce_init
d_se = d_xm - d_xce
if (d_se .le. 0) then
xse = 0
else
xse = d_se
end if
F = p0*Kse*xse
svars(2) = F
ampValueNew = svars(2)
!! Increase counters
svars(3) = svars(3) + 1
svars(10) = svars(10) - 1
if (svars(10) .eq. 0) then
! Write muscle length to file to input back into NEURON simulation
FILE_XM_OUT=trim(outdir)//'\xm_tracker.txt'
OPEN(UNIT=113, FILE=FILE_XM_OUT, STATUS='UNKNOWN', action='WRITE', access='SEQUENTIAL')
write(113,*) svars(6)
close(113)
close(111,status='delete')
close(112,status='delete')
svars(10) = 3999
end if
!Save value of XCE from this step for calculation in next step
svars(13) = xce
end if
return
end