! 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(*)
! -----------------------------------------------------------------------------------
!! Define the type of each variable that will be used in the simulation
character*256 FILE_F, FILE_F2
real(8) svars
character*255 jobname,outdir
character(len=:), allocatable :: cwd, cmd, cmd2
integer :: rc, rc2
! -----------------------------------------------------------------------------------
!! Here is what will be ran/calculated each iteration of the simulation
! Get the names of the job and directory to use for file read in/out
call vgetjobname(jobname,lenjobname)
call vgetoutdir(outdir,lenoutdir)
! Run this to calculate soleus force amplitude
if (ampName(1:11) .eq. 'AMP_SOLEUS3' ) then
if (lFlagsInfo(iInitialization).eq.1) then
! Put anything in this 'if' statement that you want to occur only the first time the
! subroutine is called
! Call a command window to run the NetPyNE/NEURON simulation from. This runs
! (1) a flush of the command window to not have other characters interfere with naming
! (2) change directory to navigate to the current working folder
! (3) 'nrnivmodl' to compile the necessary dll files for the NEURON .mod files
! (4) NetPyNE simulation written in the called .py file
cwd = outdir(1:lenoutdir)
cmd = 'ipconfig/flushdns && cd '//trim(outdir)//' && nrnivmodl && python network_model_310MUs.py'
rc = system(cmd)
! Call a command window to calculate the muscle force from the output results
! from the NetPyNE simulation stored in a .pkl file. This runs
! (1) a flush of the command window to not have other characters interfere with naming
! (2) change directory to navigate to the current working folder
! (3) force calculation written in the called .py file
cmd2 = 'ipconfig/flushdns && cd '//trim(outdir)//' && python force_pkl_file.py'
rc2 = system(cmd2)
! Open the file containing the calculated muscle forces
FILE_F=trim(outdir)//'\force_output_results.txt'
OPEN(UNIT=114, FILE=FILE_F, STATUS='UNKNOWN', action='READ', access='SEQUENTIAL')
! Set the initial value for force [svars(2)]
ampValueNew = ampValueOld
svars(1) = ampValueNew
svars(2) = 0.00001 !Will be used to track ampValueNew (force) that is input back to Abaqus
else
! Put anything in this 'else' statement that will occur every iteration of the simulation
! Read in the next force value each iteration of the simulation and set equal to ampValueNew to
! be input properly into Abaqus
read(114,'(F18.6)') svars(2) !Force
ampValueNew = svars(2)
end if
end if
! Calculate tibialis anterior force amplitude
if (ampName(1:11) .eq. 'AMP_TIBANT3' ) then
if (lFlagsInfo(iInitialization).eq.1) then
! Put anything in this 'if' statement that you want to occur only the first time the
! subroutine is called
! Open the file containing the calculated muscle forces
FILE_F2=trim(outdir)//'\force_output_results_copy.txt'
OPEN(UNIT=115, FILE=FILE_F2, STATUS='UNKNOWN', action='READ', access='SEQUENTIAL')
! Set the initial value for tibant force [svars(4)]
ampValueNew = ampValueOld
svars(3) = ampValueNew
svars(4) = 0.00001 !Will be used to track ampValueNew (force) that is input back to Abaqus
else
! Put anything in this 'else' statement that will occur every iteration of the simulation
! Read in the next force value each iteration of the simulation
read(115,'(F18.6)') svars(4) !Force
! If the soleus force is less than 30N, leave tibant turned off.
! Otherwise, have tibant force match the soleus force to hold a plantarflexed position.
if (svars(4) .le. 30) then
ampValueNew = 0.00001
else
ampValueNew = svars(4)
end if
end if
end if
return
end