From b932823eba8d5d3ceb7c7f6ebf167cc710406179 Mon Sep 17 00:00:00 2001 From: Sarah Sandholtz Date: Thu, 18 Aug 2016 19:01:38 -0400 Subject: [PATCH 01/11] First version: tracking methylation profile during BD simulations --- Makefile | 2 +- input/initial_methyl_profile.f90 | 31 +++++++++++++ input/input | 18 +++++--- src/BDcode/BDsim.f90 | 25 ++++++++++- src/BDcode/calc_dist.f90 | 19 ++++++++ src/BDcode/check_reactions.f90 | 59 +++++++++++++++++++++++++ src/BDcode/colchecker.f90 | 50 ++++++++++++++++----- src/BDcode/methyl_profile.f90 | 44 ++++++++++++++++++ src/BDcode/tot_rate_constant.f90 | 15 +++++++ src/SIMcode/initial_methyl_profile.f90 | 22 +++++++++ src/SIMcode/wlcsim.f90 | 28 +++++++++++- wlcsim.dep | 22 ++++++--- wlcsim.exe | Bin 299577 -> 302472 bytes 13 files changed, 309 insertions(+), 26 deletions(-) create mode 100644 input/initial_methyl_profile.f90 create mode 100644 src/BDcode/calc_dist.f90 create mode 100644 src/BDcode/check_reactions.f90 create mode 100644 src/BDcode/methyl_profile.f90 create mode 100644 src/BDcode/tot_rate_constant.f90 create mode 100644 src/SIMcode/initial_methyl_profile.f90 diff --git a/Makefile b/Makefile index a0d7f9e6..8e118d0a 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ FLFLAGS = # depends on MOD_SRC := src/third_party/mt19937.f90 src/third_party/kdtree2.f90 src/BDcode/colsort.f90 MOD_MOD := $(addprefix src/,$(notdir $(MOD_SRC:.f90=.mod))) -SRC := src/DATAcode/MINV.f90 src/DATAcode/find_struc.f90 src/BDcode/force_elas.f90 src/BDcode/force_ponp.f90 src/BDcode/RKstep.f90 src/BDcode/concalc.f90 src/SIMcode/debugging.f90 src/third_party/dgtsv.f src/BDcode/BDsim.f90 src/MCcode/MC_move.f90 src/MCcode/MCsim.f90 src/MCcode/MC_elas.f90 src/MCcode/MC_capsid_ex.f90 src/MCcode/MC_self.f90 src/SIMcode/globals.f90 src/SIMcode/stressp.f90 src/SIMcode/energy_ponp.f90 src/SIMcode/gasdev.f90 src/SIMcode/r_to_erg.f90 src/SIMcode/ran2.f90 src/SIMcode/decim.f90 src/SIMcode/wlcsim.f90 src/SIMcode/stress.f90 src/SIMcode/ran1.f90 src/SIMcode/energy_elas.f90 src/SIMcode/initcond.f90 src/SIMcode/getpara.f90 src/BDcode/colchecker.f90 +SRC := src/DATAcode/MINV.f90 src/DATAcode/find_struc.f90 src/BDcode/force_elas.f90 src/BDcode/force_ponp.f90 src/BDcode/RKstep.f90 src/BDcode/concalc.f90 src/SIMcode/debugging.f90 src/third_party/dgtsv.f src/BDcode/BDsim.f90 src/MCcode/MC_move.f90 src/MCcode/MCsim.f90 src/MCcode/MC_elas.f90 src/MCcode/MC_capsid_ex.f90 src/MCcode/MC_self.f90 src/SIMcode/globals.f90 src/SIMcode/stressp.f90 src/SIMcode/energy_ponp.f90 src/SIMcode/gasdev.f90 src/SIMcode/r_to_erg.f90 src/SIMcode/ran2.f90 src/SIMcode/decim.f90 src/SIMcode/wlcsim.f90 src/SIMcode/stress.f90 src/SIMcode/ran1.f90 src/SIMcode/energy_elas.f90 src/SIMcode/initcond.f90 src/SIMcode/getpara.f90 src/BDcode/colchecker.f90 src/BDcode/check_reactions.f90 src/BDcode/tot_rate_constant.f90 src/BDcode/methyl_profile.f90 src/SIMcode/initial_methyl_profile.f90 src/BDcode/calc_dist.f90 OBJ := $(addsuffix .o,$(basename $(MOD_SRC))) $(addsuffix .o,$(basename $(SRC))) TEST := src/CCcode/test_sort.f90 diff --git a/input/initial_methyl_profile.f90 b/input/initial_methyl_profile.f90 new file mode 100644 index 00000000..ef93072a --- /dev/null +++ b/input/initial_methyl_profile.f90 @@ -0,0 +1,31 @@ +subroutine methyl_profile(nt) + implicit none + integer :: ind + integer, intent(in) :: nt + integer, intent(out) :: meth_status(nt) + ! set initial methylation profile + + ! current version: place one nucleation site in the center of the chain + do ind = 1,nt/2 + meth_status(ind) = 0 + end do + meth_status((nt/2)+1) = 1 + do ind = (nt/2)+2,nt + meth_status(ind) = 0 + end do + + + + + + + + + + + + + + + + diff --git a/input/input b/input/input index a8a566d6..ac1f20a7 100644 --- a/input/input +++ b/input/input @@ -3,11 +3,11 @@ !-Record 1 ! LP Persistence length ! of DNA in nm - 1.0 + 53.0 !-Record 2 ! L Chain length - 1000.0 + 16320.0 !-Record 3 ! LBOX Box edge length - for MC box sizes @@ -23,7 +23,7 @@ !-Record 6 ! N Number of beads - 1001 + 601 !-Record 7 Sarah was running 1000 ! NP Number of polymers - won't interact unless interaction code added @@ -35,7 +35,7 @@ !-Record 9 ! INDMAX Total number of save points - 100 + 10 !-Record 10 ! DT Timestep for integration - Sarah used 0.2 in above @@ -67,10 +67,18 @@ !-Record 17 ! FPT_DIST l1 distance triggering a "collision" between beads - 2 + 10 !-Record 18 Algorithm for collision detection: 0) NONE 1) brute force, ! COL_TYPE 2) k-d tree, 3) Bruno's O(n) v1, 1 + !-Record 19 + ! KM Rate of methylation + 10 + + !-Record 20 + ! KD Rate of demethylation + 1 + ! ---------------------------------------------------- diff --git a/src/BDcode/BDsim.f90 b/src/BDcode/BDsim.f90 index dd4db90c..49084d7b 100644 --- a/src/BDcode/BDsim.f90 +++ b/src/BDcode/BDsim.f90 @@ -2,7 +2,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & INTON,IDUM,PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST, & - COL_TYPE) + COL_TYPE, METH_STATUS, KM, KD) ! ! External subroutine to perform a Brownian dynamics simulation. @@ -20,7 +20,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & ! Variables in the simulation - DOUBLE PRECISION B(NT-1) ! Bond length + DOUBLE PRECISION B(NT,1) ! Bond length DOUBLE PRECISION RS(NT,3) ! R during the step DOUBLE PRECISION US(NT,3) ! R during the step DOUBLE PRECISION L0 ! Bond distances @@ -72,6 +72,17 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & DOUBLE PRECISION FPT_DIST ! l1 dist to trigger collision INTEGER COL_TYPE ! algorithm to use for collision detection +! Variables for tracking methylation profile + INTEGER IN_RXN_RAD(NT,NT) ! is pair of sites within reaction radius? 1 = yes, 0 = no + INTEGER METH_STATUS(NT) ! methylation status of each site: 1 = methylated, 0 = unmethylated + INTEGER COULD_REACT ! number of pairs that meet criteria for reaction (i.e. within reaction radius, one bead methylated, one bead unmethylated) + INTEGER PAIRS(2,NT) ! array that holds indices of sites that could react + INTEGER RXN_HAPPEN ! reaction status: 1 = reaction, 0 = no reaction + DOUBLE PRECISION KM ! rate of methylation + DOUBLE PRECISION KD ! rate of demethylation + DOUBLE PRECISION KTOT ! total rate constant + INTEGER NUM_METHYLATED ! number of methylated sites + ! Load the input parameters EB=PARA(1) @@ -129,6 +140,16 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & call CHECK_COLLISIONS(R, NT, HAS_COLLIDED, FPT_DIST, TIME, COL_TYPE) + COULD_REACT = 0 + + call CHECK_REACTIONS(R, NT, METH_STATUS, IN_RXN_RAD, COULD_REACT, FPT_DIST) + + call TOT_RATE_CONSTANT(NT, COULD_REACT, METH_STATUS, KM, KD) + + RXN_HAPPEN = 1 + + call METHYL_PROFILE(NT,METH_STATUS, KTOT, KM, KD, NUM_METHYLATED, TIME, RXN_HAPPEN, PAIRS, DT) + ! Calculate the random forces and torques for use in this ! timestep calculation if BROWN=1 diff --git a/src/BDcode/calc_dist.f90 b/src/BDcode/calc_dist.f90 new file mode 100644 index 00000000..33e4bfd7 --- /dev/null +++ b/src/BDcode/calc_dist.f90 @@ -0,0 +1,19 @@ +subroutine calc_dist(r,nt,c1,fpt_dist,in_rxn_rad) + implicit none + integer :: ind, c2 + double precision :: d, distance + integer, intent(in) :: nt, c1, in_rxn_rad(nt,nt) + double precision, intent(in) :: r(nt,3), fpt_dist + ! when more than 2 beads are within reaction distance, find the 2 that are closest together + distance = fpt_dist + do ind = 1, nt + if (in_rxn_rad(c1,ind).eq.1 .and. c1.ne.ind) then + d = sqrt(((r(c1,1)-r(ind,1))**2)+((r(c1,2)-r(ind,2))**2)+((r(c1,3)-r(ind,3))**2)) + if (d.lt.distance) then + distance = d + c2 = ind + end if + end if + end do +end + diff --git a/src/BDcode/check_reactions.f90 b/src/BDcode/check_reactions.f90 new file mode 100644 index 00000000..2f9f1b50 --- /dev/null +++ b/src/BDcode/check_reactions.f90 @@ -0,0 +1,59 @@ +subroutine check_reactions(r, nt, meth_status, in_rxn_rad, could_react, fpt_dist) + implicit none + integer, intent(in) :: in_rxn_rad(nt,nt), meth_status(nt) + double precision, intent(inout) :: r(nt,3), fpt_dist + double precision :: check_pair(nt,nt) + integer, intent(inout) :: could_react, nt + integer :: k1, k2, c1, c2, pairs(2,nt) + ! initialize variables + do k1 = 1, nt + do k2 = 1, nt + check_pair(k1,k2) = 0 + end do + end do + + do k1 = 1, nt + pairs(1,k1) = 0 + pairs(2,k1) = 0 + end do + + ! for pairs of beads that are close enough to react, check that one + ! is methylated and one unmethylated + do k1 = 1, nt + if (sum(in_rxn_rad(k1,:)).eq.1) then + k2 = maxloc(in_rxn_rad(k1,:),1) + if (check_pair(k1,k2).eq.0) then + check_pair(k1,k2) = 1 + check_pair(k2,k1) = 1 + if (meth_status(k1).eq.1 .and. meth_status(k2).eq.0) then + could_react = could_react + 1 + pairs(1,could_react) = k1 + pairs(2,could_react) = k2 + else if (meth_status(k1).eq.0 .and. meth_status(k2).eq.1) then + could_react = could_react + 1 + pairs(1,could_react) = k2 + pairs(2,could_react) = k1 + end if + end if + else if (sum(in_rxn_rad(k1,:)).gt.1) then + c1 = k1 + call calc_dist(r,nt,c1,fpt_dist) + k2 = c2 + if (check_pair(k1,k2).eq.0) then + check_pair(k1,k2) = 1 + check_pair(k2,k1) = 1 + if (meth_status(k1).eq.1 .and. meth_status(k2).eq.0) then + could_react = could_react + 1 + pairs(1,could_react) = k1 + pairs(2,could_react) = k2 + else if (meth_status(k1).eq.0 .and. meth_status(k2).eq.1) then + could_react = could_react + 1 + pairs(1,could_react) = k2 + pairs(2,could_react) = k1 + end if + end if + end if + end do +end + + diff --git a/src/BDcode/colchecker.f90 b/src/BDcode/colchecker.f90 index 7764a121..6a33d81f 100644 --- a/src/BDcode/colchecker.f90 +++ b/src/BDcode/colchecker.f90 @@ -14,12 +14,13 @@ subroutine insertion_sort(n,a) 30 continue end -subroutine check_collisions(r, nt, has_collided, fpt_dist, time, col_type) +subroutine check_collisions(r, nt, has_collided, fpt_dist, time, col_type, in_rxn_rad) implicit none integer, intent(in) :: nt, col_type double precision, intent(in) :: fpt_dist, time double precision, intent(in) :: r(nt,3) double precision, intent(inout) :: has_collided(nt, nt) + integer, intent(inout) :: in_rxn_rad(nt,nt) if (col_type.eq.0) then return else if (col_type.eq.1) then @@ -27,24 +28,35 @@ subroutine check_collisions(r, nt, has_collided, fpt_dist, time, col_type) else if (col_type.eq.2) then call check_collisions_kd(r, nt, has_collided, fpt_dist, time) else if (col_type.eq.3) then - call check_collisions_bb(r, nt, has_collided, fpt_dist, time) + call check_collisions_bb(r, nt, has_collided, fpt_dist, time, in_rxn_rad) end if end subroutine check_collisions_brute(r, nt, has_collided, fpt_dist, & time) - integer nt + implicit none + integer nt, in_rxn_rad(nt,nt),k1,k2 double precision fpt_dist, time double precision r(nt,3), has_collided(nt, nt) + ! initialize in_rxn_rad + do k1 = 1, nt + do k2 = 1, nt + in_rxn_rad(k1,k2) = 0 + end do + end do + ! check if the particles have collided do k1 = 1, nt do k2 = 1, nt - if (has_collided(k1,k2).lt.0.0d0 .and. k1.ne.k2 & + if (k1.ne.k2 & .and. abs(r(k1,1) - r(k2,1)) < fpt_dist & .and. abs(r(k1,2) - r(k2,2)) < fpt_dist & .and. abs(r(k1,3) - r(k2,3)) < fpt_dist) then - has_collided(k1,k2) = time - end if + in_rxn_rad(k1,k2) = 1 + if (has_collided(k1,k2).lt.0.0d0) then + has_collided(k1,k2) = time + end if + end if end do end do end @@ -52,13 +64,20 @@ subroutine check_collisions_brute(r, nt, has_collided, fpt_dist, & subroutine check_collisions_kd(r, nt, has_collided, fpt_dist, time) use kdtree2_module, only : kdtree2, kdtree2_result, kdtree2_create, & kdtree2_r_nearest_around_point - - integer nt, nfound, nalloc, k1, k2, i + implicit none + integer nt, nfound, nalloc, k1, k2, i, in_rxn_rad(nt,nt) double precision fpt_dist, time double precision r(nt,3), has_collided(nt, nt) type(kdtree2), pointer :: col_tree type(kdtree2_result), allocatable :: kd_results(:) + ! initialize in_rxn_rad + do k1 = 1, nt + do k2 = 1, nt + in_rxn_rad(k1,k2) = 0 + end do + end do + col_tree => kdtree2_create(r, rearrange = .true., sort = .false.) do k1 = 1,nt call kdtree2_r_nearest_around_point(col_tree, idxin = k1, & @@ -66,6 +85,7 @@ subroutine check_collisions_kd(r, nt, has_collided, fpt_dist, time) results = kd_results) do i = 1,nfound k2 = kd_results(i)%idx + in_rxn_rad(k1,k2) = 1 if (has_collided(k1,k2) .lt. 0) then has_collided(k1,k2) = time endif @@ -73,7 +93,7 @@ subroutine check_collisions_kd(r, nt, has_collided, fpt_dist, time) enddo end -subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time) +subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time, in_rxn_rad) ! at each time point, we want to have 2 "pointer arrays", ind & indi ! r(ind(:,k),k) is in order for k in 1,2,3 i.e. [~,ind(:,1)] = sort(r(:,1) ! ind(indi(i,k),k) == i for k in 1,2,3 @@ -85,6 +105,7 @@ subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time) integer, parameter :: dp = REAL64 integer, intent(in) :: nt + integer, intent(inout) :: in_rxn_rad(nt,nt) double precision, intent(in) :: fpt_dist, time, r(nt,3) double precision, intent(inout) :: has_collided(nt, nt) @@ -107,8 +128,16 @@ subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time) ! better: "" "" if d == 1 (i.e. we're adding j to triplet array) integer, save, allocatable, dimension(:,:) :: ind, indi integer, save :: is_allocated = 0 ! "static" variable, allow initial setup - integer :: curr_indi, curr_ind, i, j, d, rd0 + integer :: curr_indi, curr_ind, i, j, d, rd0, k1, k2 double precision :: rneighbor + + ! initialize in_rxn_rad + do k1 = 1, nt + do k2 = 1, nt + in_rxn_rad(k1,k2) = 0 + end do + end do + ! initialize ind and indi on first pass, requires O(n log n) sort if (is_allocated == 0) then is_allocated = 1 @@ -218,6 +247,7 @@ subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time) ! neighbors(neighborj, beadi), num_neighbors(beadi) do i = 1, nt do j = 1, num_neighbors(i) + in_rxn_rad(neighbors(j,i),i) = 1 if (has_collided(neighbors(j,i),i) < 0.0_dp) then has_collided(neighbors(j,i),i) = time endif diff --git a/src/BDcode/methyl_profile.f90 b/src/BDcode/methyl_profile.f90 new file mode 100644 index 00000000..4975e316 --- /dev/null +++ b/src/BDcode/methyl_profile.f90 @@ -0,0 +1,44 @@ +subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt) + use mt19937, only : grnd + implicit none + integer, intent(in) :: nt,num_methylated, pairs(2,nt) + integer, intent(inout) :: meth_status(nt),rxn_happen + double precision, intent(in) :: km, kd, ktot, time, dt + double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn + integer :: site_rxn, count, i + ! for pairs of beads that could transfer a methyl mark, + ! perform Gillespie algorithm to determine if reaction happens and then update methyl profile + dt_mod = dt + if (rxn_happen.eq.1) then + ! does a reaction occur? + rn1 = grnd() + prob_no_rxn = exp(-ktot*dt_mod) + if (rn1.gt.prob_no_rxn) then + ! which reaction occurred? + rn2 = grnd() + if (rn2.lt.(kd/ktot)*num_methylated) then ! one site is demethylated + site_rxn = ceiling(rn2/(kd/ktot)) + count = 0 + i = 1 + do while (count.lt.site_rxn) + count = count + meth_status(i) + i = i+1 + end do + meth_status(i-1) = 0 + else ! one site is methylated + site_rxn = ceiling(rn2/(km/ktot)) + meth_status(pairs(2,site_rxn)) = 1 + end if + ! at what time did it occur? + rn3 = grnd() + time_rxn = time - (1/ktot)*log(rn2*(prob_no_rxn-1)+1) + dt_mod = time + dt - time_rxn + else + rxn_happen = 0 + end if + end if +end + + + + diff --git a/src/BDcode/tot_rate_constant.f90 b/src/BDcode/tot_rate_constant.f90 new file mode 100644 index 00000000..6351f105 --- /dev/null +++ b/src/BDcode/tot_rate_constant.f90 @@ -0,0 +1,15 @@ +subroutine tot_rate_constant(nt,could_react,meth_status,km,kd) + implicit none + integer, intent(in) :: nt, could_react, meth_status(nt) + double precision, intent(in) :: km, kd + double precision :: ktot + integer :: num_methylated + ! determine total rate constant for all possible reactions + num_methylated = sum(meth_status) + ktot = num_methylated*kd + could_react*km +end + + + + + diff --git a/src/SIMcode/initial_methyl_profile.f90 b/src/SIMcode/initial_methyl_profile.f90 new file mode 100644 index 00000000..2094e23d --- /dev/null +++ b/src/SIMcode/initial_methyl_profile.f90 @@ -0,0 +1,22 @@ +subroutine initial_methyl_profile(nt) + implicit none + integer, intent(in) :: nt + integer :: ind, nuc_site, meth_status(nt) + + nuc_site = ceiling(real(nt/2.0)) + + do ind = 1, nuc_site - 1 + meth_status(ind) = 0 + end do + + meth_status(nuc_site) = 1 + + do ind = nuc_site + 1, nt + meth_status(ind) = 0 + end do + +end + + + + diff --git a/src/SIMcode/wlcsim.f90 b/src/SIMcode/wlcsim.f90 index 8f9a03cb..171af09a 100644 --- a/src/SIMcode/wlcsim.f90 +++ b/src/SIMcode/wlcsim.f90 @@ -85,6 +85,11 @@ PROGRAM wlcsim DOUBLE PRECISION FPT_DIST ! l1 dist to trigger collision INTEGER COL_TYPE ! what kind of collision checking to use +! Variables for tracking methylation profile + INTEGER, ALLOCATABLE, DIMENSION(:):: METH_STATUS ! methylation status of each site: 1 = methylated, 0 = unmethylated + DOUBLE PRECISION KM ! rate of methylation + DOUBLE PRECISION KD ! rate of demethylation + ! Load in the parameters for the simulation @@ -115,6 +120,10 @@ PROGRAM wlcsim read (unit=5, fmt=*) FPT_DIST read (unit=5, fmt='(2(/))') read (unit=5, fmt=*) COL_TYPE + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) KM + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) KD close(5) call getpara(PARA,DT,SIMTYPE) DT0=DT @@ -134,11 +143,18 @@ PROGRAM wlcsim ALLOCATE(HAS_COLLIDED(1,1)) HAS_COLLIDED = -1.0d+0 endif + ALLOCATE(METH_STATUS(NT)) + +!!!! debugging + print *, "The methylation rate is ", KM + print *, "The demethylation rate is ", KD ! Setup the initial condition call initcond(R,U,NT,N,NP,IDUM,FRMFILE,PARA) + call initial_methyl_profile(NT) + ! Turn on moves for each simulation type if (SIMTYPE.EQ.1) then @@ -251,7 +267,8 @@ PROGRAM wlcsim endif if (NSTEP.EQ.0) then call BDsim(R,U,NT,N,NP,TIME,TSAVE,DT,BROWN,INTON,IDUM, & - PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST,COL_TYPE) + PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST,COL_TYPE, & + METH_STATUS,KM,KD) endif ! Save the conformation and the metrics @@ -283,12 +300,19 @@ PROGRAM wlcsim snapnm='data/coltimes' IF (COL_TYPE.NE.0) then OPEN (UNIT=1, FILE=snapnm, STATUS='REPLACE') - DO, I=1,NT + DO I=1,NT WRITE(1,*) ( HAS_COLLIDED(i,j), j=1,NT ) ENDDO CLOSE(1) ENDIF + snapnm='data/methylation'//fileind((4-TENS+1):4) + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') + DO I=1,NT + WRITE(1,*) METH_STATUS(I) + ENDDO + CLOSE(1) + call stress(SIG,R,U,NT,N,NP,PARA,INTON,SIMTYPE) call stressp(COR,R,U,R0,U0,NT,N,NP,PARA,INTON,SIMTYPE) diff --git a/wlcsim.dep b/wlcsim.dep index 97ede406..0063b3f2 100644 --- a/wlcsim.dep +++ b/wlcsim.dep @@ -2,10 +2,14 @@ src/third_party/mt19937.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/third_party/mt19937.f90 -o src/third_party/mt19937.o +src/SIMcode/initial_methyl_profile.o : + gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/initial_methyl_profile.f90 -o src/SIMcode/initial_methyl_profile.o src/DATAcode/find_struc.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/DATAcode/find_struc.f90 -o src/DATAcode/find_struc.o src/SIMcode/energy_ponp.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/energy_ponp.f90 -o src/SIMcode/energy_ponp.o +src/BDcode/tot_rate_constant.o : + gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/BDcode/tot_rate_constant.f90 -o src/BDcode/tot_rate_constant.o src/SIMcode/ran1.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/ran1.f90 -o src/SIMcode/ran1.o src/SIMcode/stressp.o : @@ -31,11 +35,12 @@ src/SIMcode/getpara.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/getpara.f90 -o src/SIMcode/getpara.o src/SIMcode/globals.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/globals.f90 -o src/SIMcode/globals.o +src/BDcode/check_reactions.o : + gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/BDcode/check_reactions.f90 -o src/BDcode/check_reactions.o src/SIMcode/decim.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/decim.f90 -o src/SIMcode/decim.o src/BDcode/colchecker.o : \ - src/third_party/kdtree2.o \ - src/SIMcode/globals.o + src/third_party/kdtree2.o gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/BDcode/colchecker.f90 -o src/BDcode/colchecker.o src/SIMcode/ran2.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/ran2.f90 -o src/SIMcode/ran2.o @@ -47,6 +52,10 @@ src/SIMcode/initcond.o : \ gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/initcond.f90 -o src/SIMcode/initcond.o src/BDcode/colsort.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/BDcode/colsort.f90 -o src/BDcode/colsort.o +src/third_party/kdtree2.o : \ + src/third_party/kdtree2.o \ + src/third_party/kdtree2.o + gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/third_party/kdtree2.f90 -o src/third_party/kdtree2.o src/SIMcode/wlcsim.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/wlcsim.f90 -o src/SIMcode/wlcsim.o src/BDcode/force_elas.o : @@ -61,10 +70,11 @@ src/DATAcode/MINV.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/DATAcode/MINV.f90 -o src/DATAcode/MINV.o src/SIMcode/stress.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/SIMcode/stress.f90 -o src/SIMcode/stress.o -src/third_party/kdtree2.o : \ - src/third_party/kdtree2.o \ - src/third_party/kdtree2.o - gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/third_party/kdtree2.f90 -o src/third_party/kdtree2.o +src/BDcode/calc_dist.o : + gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/BDcode/calc_dist.f90 -o src/BDcode/calc_dist.o +src/BDcode/methyl_profile.o : \ + src/third_party/mt19937.o + gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/BDcode/methyl_profile.f90 -o src/BDcode/methyl_profile.o src/MCcode/MC_self.o : gfortran -c -ggdb -Jsrc -Isrc -Isrc/third_party -cpp src/MCcode/MC_self.f90 -o src/MCcode/MC_self.o src/SIMcode/energy_elas.o : diff --git a/wlcsim.exe b/wlcsim.exe index 0747ee558e2f75d76bb2010dc0805428068c10a6..c76cf6356c11df548593c0a3daf773a7e5a68132 100755 GIT binary patch literal 302472 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

b zmN}VNpfivS03u&PgvZQ;UE?A8z3me1G}UFL7k5=)8USb~T~5moW+2Y}ep-mg8!rVB zxpQsP^7q!|LC$eDXF~ENmjt7i0Qce7NgUs~1bVwU{x`uf40o;NnstD!xr-Ql7$o{n@Un;pBe4|nw1k1)zydtS-I7Nnr)sT)+p&VEhm`v^ zjPY{1xQ>MD*dsU!v2e}bV_1u2iZq;UziL_eG!k&vF;{%bqC~8YF zza%0BaR6pe4det`Tn{U$LOgz|k%$x=z2#5*P@u&QL}$LY9Jgr>k+Ku4_|2ZZY{!Wx zQ&CzvHJPqY;^TVi6%oG2D;3Y%Te{~NpZC_lxnmUnA=_?w1wF{ahl6r$7GbGww^ zRT{R+P9flR=7%VU{VPx+)*r0Vji6QN_|3>Am3Dv1g_X7<;{z@3Lv)IaokYvjLZHnT zwzR_Am7g7G5x2so%E)pWD<`dCO-;90V`bpjyQWc^xmm5|-kJwhj`LFuTRo+~Q4L#m zy-g%;(6AfIv(?!tM5pB=N|~c2I0a&@UrZsk`a%hPRmySNu7>^I@Eq6>YkLwk|8r&% z+zv0xc|%tM3_0uus3T@ms}hv@p`s6iMx8{_en6iB+Ma}CPKOYcI;)_jknk4pBuu1s z%|u_hqaG>OFBK72$vN0oP}I@+l27^vG&qe@63ZuSV^FH>`&=A*A7`0-ZFGX&>-LY363NY^9~JOT%q2wROJ~Vyi2ZaHEEJGmH9A zySZpp+J~qCCG{a{KS_OvDk+Ieb&}i*xOp}96lV+cdYuzdBQ`6z16B7esP;vKr`P8J zbDU8vAn9oU*W<3lGnKy`6+oTU2OsGYz&DY77?KpjfsGHpO96Z{b8*h#pIJuZ7e_;x zIcXkZJ%IlJJ$&+Xf;w4{d4V$zL!;NZDaq#TYO{Tn!M?We4BNbiY>xg3&s2V=);K4D zHXk;%q6GLGcGU)ar7$vj0i!zzO<>z<1O6vi+r`Y?0{mx5_@>%G+GfJr6CXD<0~qRB zk|vA_!I20tJWLBfeWzJKe7K5|#;>Dflf18CcWvnWd-ITUY%<>`p%0AkRVhTrjr>5^ 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 a;cw|tT&Okbd*XufuDhJR5S>P5tp5w7k11mS literal 299577 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 z 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 Tut@YJRLNpXH`J;4U From def90e8b92512d1d21d2a7aeb2ad9fc5f09c4a1a Mon Sep 17 00:00:00 2001 From: Sarah Sandholtz Date: Sat, 20 Aug 2016 11:52:43 -0700 Subject: [PATCH 02/11] fixed bugs: seg faults, i/o issues simulation runs and is ready for testing --- input/input | 4 +- run-parallel.sh | 32 ++++++++++ run_parameter.pl | 66 +++++++++++++++++++++ run_parameter_series.pl | 78 +++++++++++++++++++++++++ runsim.sh | 5 ++ src/BDcode/BDsim.f90 | 4 +- src/BDcode/calc_dist.f90 | 2 +- src/BDcode/check_reactions.f90 | 2 +- src/BDcode/methyl_profile.f90 | 9 ++- src/SIMcode/initial_methyl_profile.f90 | 13 +++-- src/SIMcode/wlcsim.f90 | 15 +++-- wlcsim.exe | Bin 302536 -> 302656 bytes 12 files changed, 210 insertions(+), 20 deletions(-) create mode 100755 run-parallel.sh create mode 100755 run_parameter.pl create mode 100755 run_parameter_series.pl create mode 100755 runsim.sh diff --git a/input/input b/input/input index ac1f20a7..36b0a16d 100644 --- a/input/input +++ b/input/input @@ -31,11 +31,11 @@ !-Record 8 Sarah: 5x10e4 time takes for 10pers length chains on average ! TF Total simulation time - 10 + 1000000 !-Record 9 ! INDMAX Total number of save points - 10 + 1000 !-Record 10 ! DT Timestep for integration - Sarah used 0.2 in above diff --git a/run-parallel.sh b/run-parallel.sh new file mode 100755 index 00000000..e11220ab --- /dev/null +++ b/run-parallel.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -eu +set -o pipefail + +codedir=`pwd` + +COUNTER=0 +until [ ! -d par-run-dir.$COUNTER ]; do + let COUNTER+=1 +done +pardir="par-run-dir.$COUNTER" +echo "Running simulations in ${COUNTER}!" +nprocs=`grep -c ^processor /proc/cpuinfo` +let nprocs-=1 +echo "Using $nprocs processors!" +mkdir -p "$pardir" +cd "$pardir" +for core in `seq 1 $nprocs`; do + rundir=run.$core + mkdir -p "$rundir" + cp -r "${codedir}/input" "${codedir}/run_parameter.pl" "$rundir" + cd "$rundir" + mkdir -p data savedata + echo "#!/bin/bash" >> runsim.sh + echo "rm data/*" >> runsim.sh + echo "../../wlcsim" >> runsim.sh + chmod a+x runsim.sh + ./run_parameter.pl & + cd .. +done + diff --git a/run_parameter.pl b/run_parameter.pl new file mode 100755 index 00000000..45c9be15 --- /dev/null +++ b/run_parameter.pl @@ -0,0 +1,66 @@ +#!/usr/bin/perl -w + +#use strict; +#require 'calcVecs.pl'; + +my $npara=41; # Number of simulations +my $paraind=4; # Index of parameter to vary +my $val1=0.0; # First value of parameter +my $val2=1.0; # Second value of parameter +my $logspace=0; # Are parameter values log spaced? +my $intval=0; # Is the parameter an integer? + +my $ii=1; +my $val; + +system("cp input/input input/input-save"); + +while ($ii <= $npara) { + +# Evaluate the value (either linear or log spaced) + if ($logspace == 1) { + $val=$val1*exp(($ii-1)/($npara-1)*log($val2/$val1)); + } else { + $val=$val1+($ii-1)/($npara-1)*($val2-$val1); + } + +# Reset value to an integer (if $intval==1) + + if ($intval == 1) { + $val=int($val+$val/abs($val*2)); + } + +# Alter the value in the input file + + my $filein="input/input-save"; + my $fileout="input/input"; + open my $in, '<', $filein or die "Can't read old file: $!"; + open my $out, '>', $fileout or die "Can't write new file: $!"; + + while( <$in> ) # print the lines before the change + { + print $out $_; + last if $. == 2+4*$paraind-1; # line number before change + } + + my $line = <$in>; + $line = " $val\n"; + print $out $line; + + while( <$in> ) # print the rest of the lines + { + print $out $_; + } + + close $in; + close $out; + +# Run simulation and move data to savedata directory in numbered folder + + unless(-e "savedata" or mkdir "savedata") { die "Unable to stat savedata dir"; } + system("./runsim.sh"); + system("cp -r data savedata/data$ii"); + system("cp input/input savedata/data$ii/input$ii"); + + $ii++; +} diff --git a/run_parameter_series.pl b/run_parameter_series.pl new file mode 100755 index 00000000..2f30be73 --- /dev/null +++ b/run_parameter_series.pl @@ -0,0 +1,78 @@ +#!/usr/bin/perl -w + +#use strict; +#require 'calcVecs.pl'; + +my $npara=20; # Number of simulations +my $paraind=6; # Index of parameter to vary +my $val1=5; # First value of parameter +my $val2=500; # Second value of parameter +my $logspace=1; # Are parameter values log spaced? +my $intval=1; # Is the parameter an integer? +my $nsim=50; # Total number of duplicates + +my $ii; +my $val; +my $itot; + +system("cp input/input input/input-save"); + +$itot=1; +while ($itot <= $nsim) { + $ii=1; + while ($ii <= $npara) { + +# Evaluate the value (either linear or log spaced) + if ($logspace == 1) { + $val=$val1*exp(($ii-1)/($npara-1)*log($val2/$val1)); + } else { + $val=$val1+($ii-1)/($npara-1)*($val2-$val1); + } + +# Reset value to an integer (if $intval==1) + + if ($intval == 1) { + $val=int($val+$val/abs($val*2)); + } + +# Alter the value in the input file + + my $filein="input/input-save"; + my $fileout="input/input"; + open my $in, '<', $filein or die "Can't read old file: $!"; + open my $out, '>', $fileout or die "Can't write new file: $!"; + + while( <$in> ) # print the lines before the change + { + print $out $_; + last if $. == 2+4*$paraind-1; # line number before change + } + + my $line = <$in>; + $line = " $val\n"; + print $out $line; + + while( <$in> ) # print the rest of the lines + { + print $out $_; + } + + close $in; + close $out; + +# Run simulation and move data to savedata directory in numbered folder + + unless(-e "savedata" or mkdir "savedata") { die "Unable to stat savedata dir"; } + system("./runsim.sh"); + if ($itot == 1) { + system("mkdir savedata/data$ii"); + } + system("cp data/out1 savedata/data$ii/out1-$itot"); + system("cp data/out2 savedata/data$ii/out2-$itot"); + system("cp data/out3 savedata/data$ii/out3-$itot"); + system("cp input/input savedata/data$ii/input$ii"); + + $ii++; + } + $itot++; +} diff --git a/runsim.sh b/runsim.sh new file mode 100755 index 00000000..980b5e47 --- /dev/null +++ b/runsim.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -o pipefail +set -eu + +make run diff --git a/src/BDcode/BDsim.f90 b/src/BDcode/BDsim.f90 index 49084d7b..a59073de 100644 --- a/src/BDcode/BDsim.f90 +++ b/src/BDcode/BDsim.f90 @@ -138,7 +138,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & DO WHILE (TIME.LT.TTOT) - call CHECK_COLLISIONS(R, NT, HAS_COLLIDED, FPT_DIST, TIME, COL_TYPE) + call CHECK_COLLISIONS(R, NT, HAS_COLLIDED, FPT_DIST, TIME, COL_TYPE, IN_RXN_RAD) COULD_REACT = 0 @@ -148,7 +148,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & RXN_HAPPEN = 1 - call METHYL_PROFILE(NT,METH_STATUS, KTOT, KM, KD, NUM_METHYLATED, TIME, RXN_HAPPEN, PAIRS, DT) + call METHYL_PROFILE(NT,METH_STATUS, KTOT, KM, KD, NUM_METHYLATED, TIME, RXN_HAPPEN, PAIRS, DT, NUC_SITE) ! Calculate the random forces and torques for use in this diff --git a/src/BDcode/calc_dist.f90 b/src/BDcode/calc_dist.f90 index 33e4bfd7..7ce8fa07 100644 --- a/src/BDcode/calc_dist.f90 +++ b/src/BDcode/calc_dist.f90 @@ -7,7 +7,7 @@ subroutine calc_dist(r,nt,c1,fpt_dist,in_rxn_rad) ! when more than 2 beads are within reaction distance, find the 2 that are closest together distance = fpt_dist do ind = 1, nt - if (in_rxn_rad(c1,ind).eq.1 .and. c1.ne.ind) then + if ((in_rxn_rad(c1,ind).eq.1) .and. (c1.ne.ind)) then d = sqrt(((r(c1,1)-r(ind,1))**2)+((r(c1,2)-r(ind,2))**2)+((r(c1,3)-r(ind,3))**2)) if (d.lt.distance) then distance = d diff --git a/src/BDcode/check_reactions.f90 b/src/BDcode/check_reactions.f90 index 2f9f1b50..c1c9ffeb 100644 --- a/src/BDcode/check_reactions.f90 +++ b/src/BDcode/check_reactions.f90 @@ -37,7 +37,7 @@ subroutine check_reactions(r, nt, meth_status, in_rxn_rad, could_react, fpt_dist end if else if (sum(in_rxn_rad(k1,:)).gt.1) then c1 = k1 - call calc_dist(r,nt,c1,fpt_dist) + call calc_dist(r,nt,c1,fpt_dist,in_rxn_rad) k2 = c2 if (check_pair(k1,k2).eq.0) then check_pair(k1,k2) = 1 diff --git a/src/BDcode/methyl_profile.f90 b/src/BDcode/methyl_profile.f90 index 4975e316..00c51e11 100644 --- a/src/BDcode/methyl_profile.f90 +++ b/src/BDcode/methyl_profile.f90 @@ -1,7 +1,7 @@ -subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt) +subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt,nuc_site) use mt19937, only : grnd implicit none - integer, intent(in) :: nt,num_methylated, pairs(2,nt) + integer, intent(in) :: nt,num_methylated,pairs(2,nt),nuc_site integer, intent(inout) :: meth_status(nt),rxn_happen double precision, intent(in) :: km, kd, ktot, time, dt double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn @@ -18,6 +18,10 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ rn2 = grnd() if (rn2.lt.(kd/ktot)*num_methylated) then ! one site is demethylated site_rxn = ceiling(rn2/(kd/ktot)) + if (site_rxn.eq.nuc_site) then + rxn_happen = 0 + go to 16 + end if count = 0 i = 1 do while (count.lt.site_rxn) @@ -36,6 +40,7 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ else rxn_happen = 0 end if + 16 continue end if end diff --git a/src/SIMcode/initial_methyl_profile.f90 b/src/SIMcode/initial_methyl_profile.f90 index 2094e23d..6c6fc0af 100644 --- a/src/SIMcode/initial_methyl_profile.f90 +++ b/src/SIMcode/initial_methyl_profile.f90 @@ -1,18 +1,19 @@ -subroutine initial_methyl_profile(nt) +subroutine initial_methyl_profile(nt,meth_status) implicit none integer, intent(in) :: nt - integer :: ind, nuc_site, meth_status(nt) + integer, intent(inout) :: meth_status(nt) + integer :: i, nuc_site nuc_site = ceiling(real(nt/2.0)) - do ind = 1, nuc_site - 1 - meth_status(ind) = 0 + do i = 1, nuc_site - 1 + meth_status(i) = 0 end do meth_status(nuc_site) = 1 - do ind = nuc_site + 1, nt - meth_status(ind) = 0 + do i = nuc_site + 1, nt + meth_status(i) = 0 end do end diff --git a/src/SIMcode/wlcsim.f90 b/src/SIMcode/wlcsim.f90 index ff1c548c..5ca6fd8e 100644 --- a/src/SIMcode/wlcsim.f90 +++ b/src/SIMcode/wlcsim.f90 @@ -145,15 +145,18 @@ PROGRAM wlcsim endif ALLOCATE(METH_STATUS(NT)) -!!!! debugging - print *, "The methylation rate is ", KM - print *, "The demethylation rate is ", KD - ! Setup the initial condition call initcond(R,U,NT,N,NP,IDUM,FRMFILE,PARA) - call initial_methyl_profile(NT) + call initial_methyl_profile(NT,METH_STATUS) + + OPEN (UNIT = 1, FILE = 'data/m0', STATUS = 'NEW') + DO I=1,NT + WRITE(1,*) meth_status(I) + ENDDO + CLOSE(1) + ! Turn on moves for each simulation type @@ -306,7 +309,7 @@ PROGRAM wlcsim CLOSE(1) ENDIF - snapnm='data/methylation'//fileind((4-TENS+1):4) + snapnm='data/m'//fileind((4-TENS+1):4) OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') DO I=1,NT WRITE(1,*) METH_STATUS(I) diff --git a/wlcsim.exe b/wlcsim.exe index 6b2f0a5aa66dc3980dc911e1d01b23dcde2ec199..2508067931f4c0c8ddd0d844d3a95ac1d3238afe 100755 GIT binary patch delta 32605 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 z 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 Tr1TpA*k49AgKdmrs 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 Mj-&EoHOTw_0R&v5^#A|> From fae0e265b5ba1387f454a3353b2fc38bda002ae3 Mon Sep 17 00:00:00 2001 From: Sarah Sandholtz Date: Tue, 30 Aug 2016 17:56:34 -0400 Subject: [PATCH 03/11] fixed bugs: declaring variables and passing them between subroutines --- Makefile | 2 +- input/input | 16 +++++++-------- src/BDcode/BDsim.f90 | 13 ++++++++---- src/BDcode/calc_dist.f90 | 15 +++++++------- src/BDcode/check_reactions.f90 | 17 ++++++++-------- src/BDcode/colchecker.f90 | 34 ++++++++++++++++++++----------- src/BDcode/methyl_profile.f90 | 10 +++++---- src/BDcode/tot_rate_constant.f90 | 7 ++++--- src/SIMcode/wlcsim.f90 | 27 +++++++++++++++++------- wlcsim.exe | Bin 302656 -> 307313 bytes 10 files changed, 86 insertions(+), 55 deletions(-) diff --git a/Makefile b/Makefile index 8e118d0a..40e16e53 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ DEP_FILE = wlcsim.dep FC = gfortran # compile flags -FCFLAGS = -ggdb -Jsrc -Isrc -Isrc/third_party -cpp #-fcheck=all -Wall -pedantic +FCFLAGS = -ggdb -Jsrc -Isrc -Isrc/third_party -cpp #-fbounds-check #-fcheck=all -Wall -pedantic # link flags FLFLAGS = diff --git a/input/input b/input/input index 36b0a16d..624bebfd 100644 --- a/input/input +++ b/input/input @@ -7,7 +7,7 @@ !-Record 2 ! L Chain length - 16320.0 + 1632.0 !-Record 3 ! LBOX Box edge length - for MC box sizes @@ -23,7 +23,7 @@ !-Record 6 ! N Number of beads - 601 + 61 !-Record 7 Sarah was running 1000 ! NP Number of polymers - won't interact unless interaction code added @@ -31,11 +31,11 @@ !-Record 8 Sarah: 5x10e4 time takes for 10pers length chains on average ! TF Total simulation time - 1000000 + 10 !-Record 9 ! INDMAX Total number of save points - 1000 + 10 !-Record 10 ! DT Timestep for integration - Sarah used 0.2 in above @@ -59,7 +59,7 @@ !-Record 15 Quinn: 1000s times #polymers, there's a script to check if OK ! NINIT Number initialization MC steps - 40beads@rigid@2000poly==4e6 - 1000 + 100 !-Record 16 ! NSTEP Number MC steps per save @@ -67,7 +67,7 @@ !-Record 17 ! FPT_DIST l1 distance triggering a "collision" between beads - 10 + 35/53 !-Record 18 Algorithm for collision detection: 0) NONE 1) brute force, ! COL_TYPE 2) k-d tree, 3) Bruno's O(n) v1, @@ -75,10 +75,10 @@ !-Record 19 ! KM Rate of methylation - 10 + 0.2 !-Record 20 ! KD Rate of demethylation - 1 + 0.001 ! ---------------------------------------------------- diff --git a/src/BDcode/BDsim.f90 b/src/BDcode/BDsim.f90 index a59073de..645309bb 100644 --- a/src/BDcode/BDsim.f90 +++ b/src/BDcode/BDsim.f90 @@ -2,7 +2,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & INTON,IDUM,PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST, & - COL_TYPE, METH_STATUS, KM, KD) + COL_TYPE, METH_STATUS, KM, KD, NUM_SPREAD, IN_RXN_RAD, PAIRS) ! ! External subroutine to perform a Brownian dynamics simulation. @@ -82,6 +82,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & DOUBLE PRECISION KD ! rate of demethylation DOUBLE PRECISION KTOT ! total rate constant INTEGER NUM_METHYLATED ! number of methylated sites + INTEGER NUM_SPREAD ! total number of spreading events ! Load the input parameters @@ -134,6 +135,10 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & 20 CONTINUE 10 CONTINUE + KTOT = 1 + NUM_METHYLATED = 1 + + ! Begin the time integration DO WHILE (TIME.LT.TTOT) @@ -142,13 +147,13 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & COULD_REACT = 0 - call CHECK_REACTIONS(R, NT, METH_STATUS, IN_RXN_RAD, COULD_REACT, FPT_DIST) + call CHECK_REACTIONS(R, NT, METH_STATUS, IN_RXN_RAD, COULD_REACT, FPT_DIST, PAIRS) - call TOT_RATE_CONSTANT(NT, COULD_REACT, METH_STATUS, KM, KD) + call TOT_RATE_CONSTANT(NT, COULD_REACT, METH_STATUS, KM, KD, KTOT, NUM_METHYLATED) RXN_HAPPEN = 1 - call METHYL_PROFILE(NT,METH_STATUS, KTOT, KM, KD, NUM_METHYLATED, TIME, RXN_HAPPEN, PAIRS, DT, NUC_SITE) + call METHYL_PROFILE(NT,METH_STATUS, KTOT, KM, KD, NUM_METHYLATED, TIME, RXN_HAPPEN, PAIRS, DT, NUC_SITE,NUM_SPREAD) ! Calculate the random forces and torques for use in this diff --git a/src/BDcode/calc_dist.f90 b/src/BDcode/calc_dist.f90 index 7ce8fa07..b0fd5c9b 100644 --- a/src/BDcode/calc_dist.f90 +++ b/src/BDcode/calc_dist.f90 @@ -1,17 +1,18 @@ -subroutine calc_dist(r,nt,c1,fpt_dist,in_rxn_rad) +subroutine calc_dist(r,nt,fpt_dist,in_rxn_rad,k1,k2) implicit none - integer :: ind, c2 + integer :: i double precision :: d, distance - integer, intent(in) :: nt, c1, in_rxn_rad(nt,nt) + integer, intent(in) :: nt, in_rxn_rad(nt,nt), k1 double precision, intent(in) :: r(nt,3), fpt_dist + integer,intent(out) :: k2 ! when more than 2 beads are within reaction distance, find the 2 that are closest together distance = fpt_dist - do ind = 1, nt - if ((in_rxn_rad(c1,ind).eq.1) .and. (c1.ne.ind)) then - d = sqrt(((r(c1,1)-r(ind,1))**2)+((r(c1,2)-r(ind,2))**2)+((r(c1,3)-r(ind,3))**2)) + do i = 1, nt + if ((in_rxn_rad(k1,i).eq.1) .and. (k1.ne.i)) then + d = sqrt(((r(k1,1)-r(i,1))**2)+((r(k1,2)-r(i,2))**2)+((r(k1,3)-r(i,3))**2)) if (d.lt.distance) then distance = d - c2 = ind + k2 = i end if end if end do diff --git a/src/BDcode/check_reactions.f90 b/src/BDcode/check_reactions.f90 index c1c9ffeb..157e1d4b 100644 --- a/src/BDcode/check_reactions.f90 +++ b/src/BDcode/check_reactions.f90 @@ -1,10 +1,11 @@ -subroutine check_reactions(r, nt, meth_status, in_rxn_rad, could_react, fpt_dist) +subroutine check_reactions(r, nt, meth_status, in_rxn_rad, could_react, fpt_dist, pairs) implicit none - integer, intent(in) :: in_rxn_rad(nt,nt), meth_status(nt) + integer, intent(in) :: meth_status(nt) double precision, intent(inout) :: r(nt,3), fpt_dist double precision :: check_pair(nt,nt) - integer, intent(inout) :: could_react, nt - integer :: k1, k2, c1, c2, pairs(2,nt) + integer, intent(inout) :: could_react, nt, in_rxn_rad(nt,nt), pairs(2,nt) + integer :: k1,k2 + ! initialize variables do k1 = 1, nt do k2 = 1, nt @@ -36,17 +37,15 @@ subroutine check_reactions(r, nt, meth_status, in_rxn_rad, could_react, fpt_dist end if end if else if (sum(in_rxn_rad(k1,:)).gt.1) then - c1 = k1 - call calc_dist(r,nt,c1,fpt_dist,in_rxn_rad) - k2 = c2 + call calc_dist(r,nt,fpt_dist,in_rxn_rad,k1,k2) if (check_pair(k1,k2).eq.0) then check_pair(k1,k2) = 1 check_pair(k2,k1) = 1 - if (meth_status(k1).eq.1 .and. meth_status(k2).eq.0) then + if ((meth_status(k1).eq.1) .and. (meth_status(k2).eq.0)) then could_react = could_react + 1 pairs(1,could_react) = k1 pairs(2,could_react) = k2 - else if (meth_status(k1).eq.0 .and. meth_status(k2).eq.1) then + else if ((meth_status(k1).eq.0) .and. (meth_status(k2).eq.1)) then could_react = could_react + 1 pairs(1,could_react) = k2 pairs(2,could_react) = k1 diff --git a/src/BDcode/colchecker.f90 b/src/BDcode/colchecker.f90 index 6a33d81f..8b5c4bcc 100644 --- a/src/BDcode/colchecker.f90 +++ b/src/BDcode/colchecker.f90 @@ -21,23 +21,33 @@ subroutine check_collisions(r, nt, has_collided, fpt_dist, time, col_type, in_rx double precision, intent(in) :: r(nt,3) double precision, intent(inout) :: has_collided(nt, nt) integer, intent(inout) :: in_rxn_rad(nt,nt) + if (col_type.eq.0) then return else if (col_type.eq.1) then - call check_collisions_brute(r, nt, has_collided, fpt_dist, time) + call check_collisions_brute(r, nt, has_collided, fpt_dist, time, in_rxn_rad) else if (col_type.eq.2) then call check_collisions_kd(r, nt, has_collided, fpt_dist, time) else if (col_type.eq.3) then call check_collisions_bb(r, nt, has_collided, fpt_dist, time, in_rxn_rad) - end if + end if end subroutine check_collisions_brute(r, nt, has_collided, fpt_dist, & - time) + time, in_rxn_rad) implicit none - integer nt, in_rxn_rad(nt,nt),k1,k2 - double precision fpt_dist, time - double precision r(nt,3), has_collided(nt, nt) + + integer, intent(in) :: nt + integer k1, k2 + double precision, intent(in) :: fpt_dist, time, r(nt,3) + double precision, intent(inout) :: has_collided(nt, nt) + integer, intent(inout) :: in_rxn_rad(nt,nt) + + + !integer nt, in_rxn_rad(nt,nt),k1,k2 + !double precision fpt_dist, time + !double precision r(nt,3), has_collided(nt, nt) + ! initialize in_rxn_rad do k1 = 1, nt do k2 = 1, nt @@ -48,10 +58,10 @@ subroutine check_collisions_brute(r, nt, has_collided, fpt_dist, & ! check if the particles have collided do k1 = 1, nt do k2 = 1, nt - if (k1.ne.k2 & - .and. abs(r(k1,1) - r(k2,1)) < fpt_dist & - .and. abs(r(k1,2) - r(k2,2)) < fpt_dist & - .and. abs(r(k1,3) - r(k2,3)) < fpt_dist) then + if ((k1.ne.k2) & + .and. (abs(r(k1,1) - r(k2,1)) < fpt_dist) & + .and. (abs(r(k1,2) - r(k2,2)) < fpt_dist) & + .and. (abs(r(k1,3) - r(k2,3)) < fpt_dist)) then in_rxn_rad(k1,k2) = 1 if (has_collided(k1,k2).lt.0.0d0) then has_collided(k1,k2) = time @@ -105,9 +115,9 @@ subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time, in_rxn_rad) integer, parameter :: dp = REAL64 integer, intent(in) :: nt - integer, intent(inout) :: in_rxn_rad(nt,nt) double precision, intent(in) :: fpt_dist, time, r(nt,3) double precision, intent(inout) :: has_collided(nt, nt) + integer, intent(inout) :: in_rxn_rad(nt,nt) integer :: neighbors(nt,nt) ! most of array won't be used, probably ! neighbors(1:num_neighbors(i),i) holds neighbors of bead i for each i @@ -247,7 +257,7 @@ subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time, in_rxn_rad) ! neighbors(neighborj, beadi), num_neighbors(beadi) do i = 1, nt do j = 1, num_neighbors(i) - in_rxn_rad(neighbors(j,i),i) = 1 + in_rxn_rad(i,neighbors(j,i)) = 1 if (has_collided(neighbors(j,i),i) < 0.0_dp) then has_collided(neighbors(j,i),i) = time endif diff --git a/src/BDcode/methyl_profile.f90 b/src/BDcode/methyl_profile.f90 index 00c51e11..c1b7492e 100644 --- a/src/BDcode/methyl_profile.f90 +++ b/src/BDcode/methyl_profile.f90 @@ -1,11 +1,12 @@ -subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt,nuc_site) +subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt,nuc_site,num_spread) use mt19937, only : grnd implicit none - integer, intent(in) :: nt,num_methylated,pairs(2,nt),nuc_site - integer, intent(inout) :: meth_status(nt),rxn_happen + integer, intent(in) :: nt, num_methylated, pairs(2,nt), nuc_site + integer, intent(inout) :: meth_status(nt), rxn_happen, num_spread double precision, intent(in) :: km, kd, ktot, time, dt double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn integer :: site_rxn, count, i + ! for pairs of beads that could transfer a methyl mark, ! perform Gillespie algorithm to determine if reaction happens and then update methyl profile dt_mod = dt @@ -16,7 +17,7 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ if (rn1.gt.prob_no_rxn) then ! which reaction occurred? rn2 = grnd() - if (rn2.lt.(kd/ktot)*num_methylated) then ! one site is demethylated + if (rn2.lt.((kd/ktot)*num_methylated)) then ! one site is demethylated site_rxn = ceiling(rn2/(kd/ktot)) if (site_rxn.eq.nuc_site) then rxn_happen = 0 @@ -32,6 +33,7 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ else ! one site is methylated site_rxn = ceiling(rn2/(km/ktot)) meth_status(pairs(2,site_rxn)) = 1 + num_spread = num_spread + 1 end if ! at what time did it occur? rn3 = grnd() diff --git a/src/BDcode/tot_rate_constant.f90 b/src/BDcode/tot_rate_constant.f90 index 6351f105..404af54e 100644 --- a/src/BDcode/tot_rate_constant.f90 +++ b/src/BDcode/tot_rate_constant.f90 @@ -1,9 +1,10 @@ -subroutine tot_rate_constant(nt,could_react,meth_status,km,kd) +subroutine tot_rate_constant(nt,could_react,meth_status,km,kd,ktot,num_methylated) implicit none integer, intent(in) :: nt, could_react, meth_status(nt) double precision, intent(in) :: km, kd - double precision :: ktot - integer :: num_methylated + double precision, intent(inout) :: ktot + integer, intent(inout) :: num_methylated + ! determine total rate constant for all possible reactions num_methylated = sum(meth_status) ktot = num_methylated*kd + could_react*km diff --git a/src/SIMcode/wlcsim.f90 b/src/SIMcode/wlcsim.f90 index 5ca6fd8e..da57f194 100644 --- a/src/SIMcode/wlcsim.f90 +++ b/src/SIMcode/wlcsim.f90 @@ -36,7 +36,7 @@ PROGRAM wlcsim INTEGER INDMAX ! Maximum index in series INTEGER IND ! Ind in series INTEGER TENS ! Decimal of index - character*4 fileind ! Index of output + character*5 fileind ! Index of output character*16 snapnm ! File for output ! Simulation input variables @@ -87,8 +87,11 @@ PROGRAM wlcsim ! Variables for tracking methylation profile INTEGER, ALLOCATABLE, DIMENSION(:):: METH_STATUS ! methylation status of each site: 1 = methylated, 0 = unmethylated + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IN_RXN_RAD + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: PAIRS DOUBLE PRECISION KM ! rate of methylation DOUBLE PRECISION KD ! rate of demethylation + INTEGER NUM_SPREAD ! total number of spreading events ! Load in the parameters for the simulation @@ -144,6 +147,10 @@ PROGRAM wlcsim HAS_COLLIDED = -1.0d+0 endif ALLOCATE(METH_STATUS(NT)) + ALLOCATE(IN_RXN_RAD(NT,NT)) + ALLOCATE(PAIRS(2,NT)) + + NUM_SPREAD = 0 ! Setup the initial condition @@ -271,14 +278,14 @@ PROGRAM wlcsim if (NSTEP.EQ.0) then call BDsim(R,U,NT,N,NP,TIME,TSAVE,DT,BROWN,INTON,IDUM, & PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST,COL_TYPE, & - METH_STATUS,KM,KD) + METH_STATUS,KM,KD,NUM_SPREAD,IN_RXN_RAD,PAIRS) endif ! Save the conformation and the metrics - TENS=nint(log10(1.*IND)-0.4999)+1 - write (fileind,'(I4)'), IND - snapnm= 'data/r'//fileind((4-TENS+1):4) + TENS=nint(log10(1.*IND)-0.49999)+1 + write (fileind,'(I5)'), IND + snapnm= 'data/r'//fileind((5-TENS+1):5) OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') IB=1 DO 50 I=1,NP @@ -289,7 +296,7 @@ PROGRAM wlcsim 50 CONTINUE CLOSE(1) - snapnm= 'data/u'//fileind((4-TENS+1):4) + snapnm= 'data/u'//fileind((5-TENS+1):5) OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') IB=1 DO 70 I=1,NP @@ -309,12 +316,17 @@ PROGRAM wlcsim CLOSE(1) ENDIF - snapnm='data/m'//fileind((4-TENS+1):4) + snapnm='data/m'//fileind((5-TENS+1):5) OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') DO I=1,NT WRITE(1,*) METH_STATUS(I) ENDDO CLOSE(1) + + snapnm='data/num_spread' + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'REPLACE') + WRITE(1,*) NUM_SPREAD + CLOSE(1) call stress(SIG,R,U,NT,N,NP,PARA,INTON,SIMTYPE) call stressp(COR,R,U,R0,U0,NT,N,NP,PARA,INTON,SIMTYPE) @@ -342,6 +354,7 @@ PROGRAM wlcsim print*, 'End-to-end distance poly 1 ', & sqrt((R(N,1)-R(1,1))**2.+(R(N,2)-R(1,2))**2.+(R(N,3)-R(1,3))**2.) PRINT*, 'Simulation type ', SIMTYPE + PRINT*, 'Number of spreading events ', NUM_SPREAD IND=IND+1 diff --git a/wlcsim.exe b/wlcsim.exe index 2508067931f4c0c8ddd0d844d3a95ac1d3238afe..8845c8d2f4751d0656c2173a02f72814aee53da0 100755 GIT binary patch delta 74912 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

u;v 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%0A`| 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 Date: Tue, 30 Aug 2016 19:54:44 -0400 Subject: [PATCH 04/11] added new variable and updated output to screen --- src/BDcode/BDsim.f90 | 9 ++++----- src/BDcode/methyl_profile.f90 | 10 +++++++--- src/BDcode/tot_rate_constant.f90 | 1 - src/SIMcode/initial_methyl_profile.f90 | 6 +++--- src/SIMcode/wlcsim.f90 | 21 +++++++++++++++++++-- wlcsim.exe | Bin 307313 -> 307537 bytes 6 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/BDcode/BDsim.f90 b/src/BDcode/BDsim.f90 index 645309bb..767e8d30 100644 --- a/src/BDcode/BDsim.f90 +++ b/src/BDcode/BDsim.f90 @@ -2,7 +2,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & INTON,IDUM,PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST, & - COL_TYPE, METH_STATUS, KM, KD, NUM_SPREAD, IN_RXN_RAD, PAIRS) + COL_TYPE, METH_STATUS, KM, KD, NUM_SPREAD, IN_RXN_RAD, PAIRS, NUC_SITE, NUM_METHYLATED, NUM_DECAY) ! ! External subroutine to perform a Brownian dynamics simulation. @@ -83,6 +83,8 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & DOUBLE PRECISION KTOT ! total rate constant INTEGER NUM_METHYLATED ! number of methylated sites INTEGER NUM_SPREAD ! total number of spreading events + INTEGER NUC_SITE ! index of nucleation site + INTEGER NUM_DECAY ! total number of decay events ! Load the input parameters @@ -135,9 +137,6 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & 20 CONTINUE 10 CONTINUE - KTOT = 1 - NUM_METHYLATED = 1 - ! Begin the time integration @@ -153,7 +152,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & RXN_HAPPEN = 1 - call METHYL_PROFILE(NT,METH_STATUS, KTOT, KM, KD, NUM_METHYLATED, TIME, RXN_HAPPEN, PAIRS, DT, NUC_SITE,NUM_SPREAD) + call METHYL_PROFILE(NT,METH_STATUS,KTOT,KM,KD,NUM_METHYLATED,TIME,RXN_HAPPEN,PAIRS,DT,NUC_SITE,NUM_SPREAD,NUM_DECAY) ! Calculate the random forces and torques for use in this diff --git a/src/BDcode/methyl_profile.f90 b/src/BDcode/methyl_profile.f90 index c1b7492e..60f178bc 100644 --- a/src/BDcode/methyl_profile.f90 +++ b/src/BDcode/methyl_profile.f90 @@ -1,8 +1,8 @@ -subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt,nuc_site,num_spread) +subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt,nuc_site,num_spread,num_decay) use mt19937, only : grnd implicit none - integer, intent(in) :: nt, num_methylated, pairs(2,nt), nuc_site - integer, intent(inout) :: meth_status(nt), rxn_happen, num_spread + integer, intent(in) :: nt, pairs(2,nt), nuc_site + integer, intent(inout) :: meth_status(nt), rxn_happen, num_spread, num_methylated, num_decay double precision, intent(in) :: km, kd, ktot, time, dt double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn integer :: site_rxn, count, i @@ -30,6 +30,7 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ i = i+1 end do meth_status(i-1) = 0 + num_decay = num_decay + 1 else ! one site is methylated site_rxn = ceiling(rn2/(km/ktot)) meth_status(pairs(2,site_rxn)) = 1 @@ -44,6 +45,9 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ end if 16 continue end if + + num_methylated = sum(meth_status) + end diff --git a/src/BDcode/tot_rate_constant.f90 b/src/BDcode/tot_rate_constant.f90 index 404af54e..0e9d6a19 100644 --- a/src/BDcode/tot_rate_constant.f90 +++ b/src/BDcode/tot_rate_constant.f90 @@ -6,7 +6,6 @@ subroutine tot_rate_constant(nt,could_react,meth_status,km,kd,ktot,num_methylate integer, intent(inout) :: num_methylated ! determine total rate constant for all possible reactions - num_methylated = sum(meth_status) ktot = num_methylated*kd + could_react*km end diff --git a/src/SIMcode/initial_methyl_profile.f90 b/src/SIMcode/initial_methyl_profile.f90 index 6c6fc0af..70a35f06 100644 --- a/src/SIMcode/initial_methyl_profile.f90 +++ b/src/SIMcode/initial_methyl_profile.f90 @@ -1,8 +1,8 @@ -subroutine initial_methyl_profile(nt,meth_status) +subroutine initial_methyl_profile(nt,meth_status,nuc_site) implicit none integer, intent(in) :: nt - integer, intent(inout) :: meth_status(nt) - integer :: i, nuc_site + integer, intent(inout) :: meth_status(nt), nuc_site + integer :: i nuc_site = ceiling(real(nt/2.0)) diff --git a/src/SIMcode/wlcsim.f90 b/src/SIMcode/wlcsim.f90 index da57f194..2994a96e 100644 --- a/src/SIMcode/wlcsim.f90 +++ b/src/SIMcode/wlcsim.f90 @@ -91,7 +91,11 @@ PROGRAM wlcsim INTEGER, ALLOCATABLE, DIMENSION(:,:) :: PAIRS DOUBLE PRECISION KM ! rate of methylation DOUBLE PRECISION KD ! rate of demethylation + DOUBLE PRECISION KTOT ! total rate constant + INTEGER NUC_SITE ! bead index of nucleation site INTEGER NUM_SPREAD ! total number of spreading events + INTEGER NUM_METHYLATED ! number of methylated sites + INTEGER NUM_DECAY ! total number of decay events ! Load in the parameters for the simulation @@ -151,12 +155,13 @@ PROGRAM wlcsim ALLOCATE(PAIRS(2,NT)) NUM_SPREAD = 0 + NUM_DECAY = 0 ! Setup the initial condition call initcond(R,U,NT,N,NP,IDUM,FRMFILE,PARA) - call initial_methyl_profile(NT,METH_STATUS) + call initial_methyl_profile(NT,METH_STATUS,NUC_SITE) OPEN (UNIT = 1, FILE = 'data/m0', STATUS = 'NEW') DO I=1,NT @@ -164,6 +169,11 @@ PROGRAM wlcsim ENDDO CLOSE(1) + KTOT = 1.0 + NUM_METHYLATED = sum(meth_status) + + PRINT *, 'initial number of methylated sites =', NUM_METHYLATED + ! Turn on moves for each simulation type @@ -278,7 +288,7 @@ PROGRAM wlcsim if (NSTEP.EQ.0) then call BDsim(R,U,NT,N,NP,TIME,TSAVE,DT,BROWN,INTON,IDUM, & PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST,COL_TYPE, & - METH_STATUS,KM,KD,NUM_SPREAD,IN_RXN_RAD,PAIRS) + METH_STATUS,KM,KD,NUM_SPREAD,IN_RXN_RAD,PAIRS,NUC_SITE,NUM_METHYLATED,NUM_DECAY) endif ! Save the conformation and the metrics @@ -327,6 +337,11 @@ PROGRAM wlcsim OPEN (UNIT = 1, FILE = snapnm, STATUS = 'REPLACE') WRITE(1,*) NUM_SPREAD CLOSE(1) + + snapnm='data/num_decay' + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'REPLACE') + WRITE(1,*) NUM_DECAY + CLOSE(1) call stress(SIG,R,U,NT,N,NP,PARA,INTON,SIMTYPE) call stressp(COR,R,U,R0,U0,NT,N,NP,PARA,INTON,SIMTYPE) @@ -355,6 +370,8 @@ PROGRAM wlcsim sqrt((R(N,1)-R(1,1))**2.+(R(N,2)-R(1,2))**2.+(R(N,3)-R(1,3))**2.) PRINT*, 'Simulation type ', SIMTYPE PRINT*, 'Number of spreading events ', NUM_SPREAD + PRINT*, 'Number of methylated sites ', NUM_METHYLATED + PRINT*, 'Number of decay events ', NUM_DECAY IND=IND+1 diff --git a/wlcsim.exe b/wlcsim.exe index 8845c8d2f4751d0656c2173a02f72814aee53da0..a7be7f95ad76e36998bccb35094178c809922b87 100755 GIT binary patch delta 54014 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 ab_tq)5@T#9BRw^vch4Jx6Sj%ii2nm4xYU>c delta 52959 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 From 01bc2ae49f7aaab70f6240eb78fd6a90b6b6447f Mon Sep 17 00:00:00 2001 From: Sarah Sandholtz Date: Wed, 31 Aug 2016 16:11:21 -0700 Subject: [PATCH 05/11] fixed bug in how methylation profile was updated --- src/BDcode/BDsim.f90 | 17 +++++++++++------ wlcsim.exe | Bin 307537 -> 307545 bytes 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/BDcode/BDsim.f90 b/src/BDcode/BDsim.f90 index 767e8d30..05864372 100644 --- a/src/BDcode/BDsim.f90 +++ b/src/BDcode/BDsim.f90 @@ -137,6 +137,7 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & 20 CONTINUE 10 CONTINUE + RXN_HAPPEN = 1 ! Begin the time integration @@ -144,16 +145,20 @@ SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & call CHECK_COLLISIONS(R, NT, HAS_COLLIDED, FPT_DIST, TIME, COL_TYPE, IN_RXN_RAD) - COULD_REACT = 0 - - call CHECK_REACTIONS(R, NT, METH_STATUS, IN_RXN_RAD, COULD_REACT, FPT_DIST, PAIRS) + DO WHILE (RXN_HAPPEN.EQ.1) - call TOT_RATE_CONSTANT(NT, COULD_REACT, METH_STATUS, KM, KD, KTOT, NUM_METHYLATED) + COULD_REACT = 0 + + call CHECK_REACTIONS(R, NT, METH_STATUS, IN_RXN_RAD, COULD_REACT, FPT_DIST, PAIRS) - RXN_HAPPEN = 1 + call TOT_RATE_CONSTANT(NT, COULD_REACT, METH_STATUS, KM, KD, KTOT, NUM_METHYLATED) - call METHYL_PROFILE(NT,METH_STATUS,KTOT,KM,KD,NUM_METHYLATED,TIME,RXN_HAPPEN,PAIRS,DT,NUC_SITE,NUM_SPREAD,NUM_DECAY) + call METHYL_PROFILE(NT,METH_STATUS,KTOT,KM,KD,NUM_METHYLATED,TIME, & + RXN_HAPPEN,PAIRS,DT,NUC_SITE,NUM_SPREAD,NUM_DECAY) + END DO + + RXN_HAPPEN = 1 ! Calculate the random forces and torques for use in this ! timestep calculation if BROWN=1 diff --git a/wlcsim.exe b/wlcsim.exe index a7be7f95ad76e36998bccb35094178c809922b87..adb557f5f2d4d767decfa77e22c4667422e084ec 100755 GIT binary patch delta 25811 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 HSfBp~z#_g> delta 25779 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 From 8b49ea8692e89341615333a2100bb77989e5e444 Mon Sep 17 00:00:00 2001 From: Sarah Sandholtz Date: Thu, 1 Sep 2016 15:54:07 -0700 Subject: [PATCH 06/11] fixed error in selecting site where methyl mark will spread --- src/BDcode/methyl_profile.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/BDcode/methyl_profile.f90 b/src/BDcode/methyl_profile.f90 index 60f178bc..73d51c18 100644 --- a/src/BDcode/methyl_profile.f90 +++ b/src/BDcode/methyl_profile.f90 @@ -4,7 +4,7 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ integer, intent(in) :: nt, pairs(2,nt), nuc_site integer, intent(inout) :: meth_status(nt), rxn_happen, num_spread, num_methylated, num_decay double precision, intent(in) :: km, kd, ktot, time, dt - double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn + double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn, pr integer :: site_rxn, count, i ! for pairs of beads that could transfer a methyl mark, @@ -32,7 +32,8 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ meth_status(i-1) = 0 num_decay = num_decay + 1 else ! one site is methylated - site_rxn = ceiling(rn2/(km/ktot)) + pr = rn2 - ((kd/ktot)*num_methylated) + site_rxn = ceiling(pr/(km/ktot)) meth_status(pairs(2,site_rxn)) = 1 num_spread = num_spread + 1 end if From 3b9d011ad1dafefb6116bec3c153db1e560bc9e0 Mon Sep 17 00:00:00 2001 From: Sarah Sandholtz Date: Sat, 10 Sep 2016 17:43:52 -0700 Subject: [PATCH 07/11] fixed bug with demethylation scheme --- src/BDcode/methyl_profile.f90 | 30 ++++++++++++++++++------------ src/BDcode/tot_rate_constant.f90 | 2 +- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/BDcode/methyl_profile.f90 b/src/BDcode/methyl_profile.f90 index 73d51c18..b329a91e 100644 --- a/src/BDcode/methyl_profile.f90 +++ b/src/BDcode/methyl_profile.f90 @@ -4,7 +4,7 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ integer, intent(in) :: nt, pairs(2,nt), nuc_site integer, intent(inout) :: meth_status(nt), rxn_happen, num_spread, num_methylated, num_decay double precision, intent(in) :: km, kd, ktot, time, dt - double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn, pr + double precision :: time_rxn, rn1, rn2, rn3, dt_mod, prob_no_rxn, prob_demeth, prob_meth integer :: site_rxn, count, i ! for pairs of beads that could transfer a methyl mark, @@ -17,23 +17,30 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ if (rn1.gt.prob_no_rxn) then ! which reaction occurred? rn2 = grnd() - if (rn2.lt.((kd/ktot)*num_methylated)) then ! one site is demethylated + prob_demeth = (kd/ktot)*(num_methylated-1) + if (rn2.lt.prob_demeth) then ! one site is demethylated site_rxn = ceiling(rn2/(kd/ktot)) - if (site_rxn.eq.nuc_site) then - rxn_happen = 0 - go to 16 - end if count = 0 i = 1 - do while (count.lt.site_rxn) + do while ((count.lt.site_rxn).and.(i.lt.nuc_site)) count = count + meth_status(i) i = i+1 end do - meth_status(i-1) = 0 - num_decay = num_decay + 1 + if ((count.eq.site_rxn).and.(i.lt.nuc_site)) then + meth_status(i-1) = 0 + num_decay = num_decay + 1 + elseif ((count.lt.site_rxn).and.(i.eq.nuc_site)) then + i = i+1 + do while (count.lt.site_rxn) + count = count + meth_status(i) + i = i+1 + end do + meth_status(i-1) = 0 + num_decay = num_decay + 1 + end if else ! one site is methylated - pr = rn2 - ((kd/ktot)*num_methylated) - site_rxn = ceiling(pr/(km/ktot)) + prob_meth = rn2 - prob_demeth + site_rxn = ceiling(prob_meth/(km/ktot)) meth_status(pairs(2,site_rxn)) = 1 num_spread = num_spread + 1 end if @@ -44,7 +51,6 @@ subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happ else rxn_happen = 0 end if - 16 continue end if num_methylated = sum(meth_status) diff --git a/src/BDcode/tot_rate_constant.f90 b/src/BDcode/tot_rate_constant.f90 index 0e9d6a19..9a1fb597 100644 --- a/src/BDcode/tot_rate_constant.f90 +++ b/src/BDcode/tot_rate_constant.f90 @@ -6,7 +6,7 @@ subroutine tot_rate_constant(nt,could_react,meth_status,km,kd,ktot,num_methylate integer, intent(inout) :: num_methylated ! determine total rate constant for all possible reactions - ktot = num_methylated*kd + could_react*km + ktot = (num_methylated-1)*kd + could_react*km end From f2adedff86fd0c0392bbdd9a81867357c1af964b Mon Sep 17 00:00:00 2001 From: Sarah Sandholtz Date: Wed, 21 Sep 2016 11:29:11 -0700 Subject: [PATCH 08/11] fixed bugs with modified timestep and demethylation scheme --- BasicWLC/BDcode/BDsim.f90 | 315 ++ BasicWLC/BDcode/RKstep.f90 | 72 + BasicWLC/BDcode/calc_dist.f90 | 20 + BasicWLC/BDcode/check_reactions.f90 | 58 + BasicWLC/BDcode/colchecker.f90 | 266 ++ BasicWLC/BDcode/colsort.f90 | 43 + BasicWLC/BDcode/colsort.inc | 56 + BasicWLC/BDcode/concalc.f90 | 176 + BasicWLC/BDcode/force_elas.f90 | 171 + BasicWLC/BDcode/force_ponp.f90 | 162 + BasicWLC/BDcode/methyl_profile.f90 | 63 + BasicWLC/BDcode/tot_rate_constant.f90 | 15 + BasicWLC/DATAcode/MINV.f90 | 49 + BasicWLC/DATAcode/find_struc.f90 | 118 + BasicWLC/MCcode/MC_capsid_ex.f90 | 38 + BasicWLC/MCcode/MC_elas.f90 | 214 ++ BasicWLC/MCcode/MC_move.f90 | 326 ++ BasicWLC/MCcode/MC_self.f90 | 226 ++ BasicWLC/MCcode/MCsim.f90 | 253 ++ BasicWLC/MISCcode/genutil.f90 | 279 ++ BasicWLC/MISCcode/inputparams.f90 | 361 ++ BasicWLC/MISCcode/keys.f90 | 84 + BasicWLC/MISCcode/param.loopL4N10_a2 | 22 + BasicWLC/MISCcode/quatutil.f90 | 832 +++++ BasicWLC/MISCcode/readkey.f90 | 581 +++ BasicWLC/SIMcode/debugging.f90 | 39 + BasicWLC/SIMcode/decim.f90 | 153 + BasicWLC/SIMcode/energy_elas.f90 | 78 + BasicWLC/SIMcode/energy_ponp.f90 | 147 + BasicWLC/SIMcode/gasdev.f90 | 24 + BasicWLC/SIMcode/getpara.f90 | 151 + BasicWLC/SIMcode/globals.f90 | 12 + BasicWLC/SIMcode/initcond.f90 | 150 + BasicWLC/SIMcode/initial_methyl_profile.f90 | 18 + BasicWLC/SIMcode/r_to_erg.f90 | 76 + BasicWLC/SIMcode/ran1.f90 | 30 + BasicWLC/SIMcode/ran2.f90 | 35 + BasicWLC/SIMcode/sigclear.c | 6 + BasicWLC/SIMcode/stress.f90 | 102 + BasicWLC/SIMcode/stressp.f90 | 155 + BasicWLC/SIMcode/wlcsim.f90 | 383 ++ BasicWLC/dssWLC/doc/README.aux | 22 + BasicWLC/dssWLC/doc/README.log | 218 ++ BasicWLC/dssWLC/doc/README.pdf | Bin 0 -> 164869 bytes BasicWLC/dssWLC/doc/README.tex | 657 ++++ BasicWLC/dssWLC/doc/README.toc | 16 + BasicWLC/dssWLC/doc/test.aux | 1 + BasicWLC/dssWLC/doc/test.log | 150 + BasicWLC/dssWLC/doc/test.pdf | Bin 0 -> 25391 bytes BasicWLC/dssWLC/doc/test.tex | 15 + BasicWLC/dssWLC/examples/dssWLCparams.txt | 60 + BasicWLC/dssWLC/examples/param.ex.browndyn | 34 + .../dssWLC/examples/param.ex.equildistrib | 32 + BasicWLC/dssWLC/examples/param.ex.loop | 40 + BasicWLC/dssWLC/examples/param.ex.montecarlo | 31 + BasicWLC/dssWLC/examples/param.ex.redisc | 33 + BasicWLC/dssWLC/getparams/Wigner3j.m | 97 + BasicWLC/dssWLC/getparams/cofactor.m | 18 + BasicWLC/dssWLC/getparams/dssWLCcalcparams.m | 119 + BasicWLC/dssWLC/getparams/dssWLCgetParams.m | 213 ++ BasicWLC/dssWLC/getparams/dssWLClengthScale.m | 58 + BasicWLC/dssWLC/getparams/dssWLCminLpParams.m | 100 + BasicWLC/dssWLC/getparams/dssWLCmoments.m | 154 + BasicWLC/dssWLC/getparams/dssWLCparams.txt | 60 + BasicWLC/dssWLC/getparams/dssWLCstructFact.m | 208 ++ BasicWLC/dssWLC/getparams/expandFsph.m | 87 + BasicWLC/dssWLC/getparams/getYcouple.m | 98 + BasicWLC/dssWLC/getparams/ljind.m | 7 + BasicWLC/dssWLC/getparams/ljindinv.m | 11 + BasicWLC/dssWLC/getparams/shearWLCgetAmat.m | 28 + .../dssWLC/getparams/shearWLCpropagator.m | 23 + BasicWLC/dssWLC/getparams/ssWLCdynamics.m | 45 + BasicWLC/dssWLC/getparams/tabulateparams.m | 115 + BasicWLC/dssWLC/getparams/testrun.m | 7 + BasicWLC/dssWLC/scripts/pdbutils.py | 450 +++ BasicWLC/dssWLC/scripts/pdbutils.pyc | Bin 0 -> 15716 bytes BasicWLC/dssWLC/scripts/snapshot2pdb.py | 165 + BasicWLC/dssWLC/scripts/viewsnapshots.pml | 12 + BasicWLC/dssWLC/shearableWLC.exe | Bin 0 -> 329835 bytes BasicWLC/dssWLC/source/Makefile | 42 + BasicWLC/dssWLC/source/a0boundfunc.f90 | 27 + BasicWLC/dssWLC/source/besselI0.f90 | 82 + BasicWLC/dssWLC/source/bessfin.f90 | 342 ++ BasicWLC/dssWLC/source/browndyn.f90 | 1109 ++++++ BasicWLC/dssWLC/source/chainutil.f90 | 969 +++++ BasicWLC/dssWLC/source/cylinder.f90 | 334 ++ BasicWLC/dssWLC/source/dbrent.f90 | 132 + BasicWLC/dssWLC/source/dgtsl.f | 119 + BasicWLC/dssWLC/source/genutil.f90 | 279 ++ BasicWLC/dssWLC/source/inputparams.f90 | 361 ++ BasicWLC/dssWLC/source/inpututil.f90 | 186 + BasicWLC/dssWLC/source/keys.f90 | 84 + BasicWLC/dssWLC/source/main.f90 | 264 ++ BasicWLC/dssWLC/source/manychains.f90 | 710 ++++ BasicWLC/dssWLC/source/montecarlo.f90 | 1122 ++++++ BasicWLC/dssWLC/source/mt19937.f90 | 298 ++ BasicWLC/dssWLC/source/nrtype.f90 | 30 + BasicWLC/dssWLC/source/nrutils.f90 | 1154 ++++++ BasicWLC/dssWLC/source/quartic.f | 182 + BasicWLC/dssWLC/source/quatutil.f90 | 832 +++++ BasicWLC/dssWLC/source/ranlib.f90 | 3281 +++++++++++++++++ BasicWLC/dssWLC/source/readkey.f90 | 581 +++ BasicWLC/dssWLC/source/redisc.f90 | 1107 ++++++ BasicWLC/dssWLC/source/sampleutil.f90 | 874 +++++ BasicWLC/dssWLC/source/test.f90 | 102 + BasicWLC/dssWLC/source/testmain.f90 | 946 +++++ BasicWLC/tests/test_sort.f90 | 19 + BasicWLC/third_party/DGTSL.f | 135 + BasicWLC/third_party/dgtsv.f | 263 ++ BasicWLC/third_party/kdtree2.f90 | 1901 ++++++++++ BasicWLC/third_party/mt19937.f90 | 273 ++ BasicWLC/third_party/qsort_inline.inc | 190 + BasicWLC/third_party/qsort_inline_index.inc | 35 + BasicWLC/third_party/sort.f90 | 99 + 114 files changed, 28207 insertions(+) create mode 100644 BasicWLC/BDcode/BDsim.f90 create mode 100644 BasicWLC/BDcode/RKstep.f90 create mode 100644 BasicWLC/BDcode/calc_dist.f90 create mode 100644 BasicWLC/BDcode/check_reactions.f90 create mode 100644 BasicWLC/BDcode/colchecker.f90 create mode 100644 BasicWLC/BDcode/colsort.f90 create mode 100644 BasicWLC/BDcode/colsort.inc create mode 100644 BasicWLC/BDcode/concalc.f90 create mode 100644 BasicWLC/BDcode/force_elas.f90 create mode 100644 BasicWLC/BDcode/force_ponp.f90 create mode 100644 BasicWLC/BDcode/methyl_profile.f90 create mode 100644 BasicWLC/BDcode/tot_rate_constant.f90 create mode 100644 BasicWLC/DATAcode/MINV.f90 create mode 100644 BasicWLC/DATAcode/find_struc.f90 create mode 100644 BasicWLC/MCcode/MC_capsid_ex.f90 create mode 100644 BasicWLC/MCcode/MC_elas.f90 create mode 100644 BasicWLC/MCcode/MC_move.f90 create mode 100644 BasicWLC/MCcode/MC_self.f90 create mode 100644 BasicWLC/MCcode/MCsim.f90 create mode 100644 BasicWLC/MISCcode/genutil.f90 create mode 100644 BasicWLC/MISCcode/inputparams.f90 create mode 100644 BasicWLC/MISCcode/keys.f90 create mode 100644 BasicWLC/MISCcode/param.loopL4N10_a2 create mode 100644 BasicWLC/MISCcode/quatutil.f90 create mode 100644 BasicWLC/MISCcode/readkey.f90 create mode 100644 BasicWLC/SIMcode/debugging.f90 create mode 100644 BasicWLC/SIMcode/decim.f90 create mode 100644 BasicWLC/SIMcode/energy_elas.f90 create mode 100644 BasicWLC/SIMcode/energy_ponp.f90 create mode 100644 BasicWLC/SIMcode/gasdev.f90 create mode 100644 BasicWLC/SIMcode/getpara.f90 create mode 100644 BasicWLC/SIMcode/globals.f90 create mode 100644 BasicWLC/SIMcode/initcond.f90 create mode 100644 BasicWLC/SIMcode/initial_methyl_profile.f90 create mode 100644 BasicWLC/SIMcode/r_to_erg.f90 create mode 100644 BasicWLC/SIMcode/ran1.f90 create mode 100644 BasicWLC/SIMcode/ran2.f90 create mode 100644 BasicWLC/SIMcode/sigclear.c create mode 100644 BasicWLC/SIMcode/stress.f90 create mode 100644 BasicWLC/SIMcode/stressp.f90 create mode 100644 BasicWLC/SIMcode/wlcsim.f90 create mode 100644 BasicWLC/dssWLC/doc/README.aux create mode 100644 BasicWLC/dssWLC/doc/README.log create mode 100644 BasicWLC/dssWLC/doc/README.pdf create mode 100644 BasicWLC/dssWLC/doc/README.tex create mode 100644 BasicWLC/dssWLC/doc/README.toc create mode 100644 BasicWLC/dssWLC/doc/test.aux create mode 100644 BasicWLC/dssWLC/doc/test.log create mode 100644 BasicWLC/dssWLC/doc/test.pdf create mode 100644 BasicWLC/dssWLC/doc/test.tex create mode 100644 BasicWLC/dssWLC/examples/dssWLCparams.txt create mode 100644 BasicWLC/dssWLC/examples/param.ex.browndyn create mode 100644 BasicWLC/dssWLC/examples/param.ex.equildistrib create mode 100644 BasicWLC/dssWLC/examples/param.ex.loop create mode 100644 BasicWLC/dssWLC/examples/param.ex.montecarlo create mode 100644 BasicWLC/dssWLC/examples/param.ex.redisc create mode 100644 BasicWLC/dssWLC/getparams/Wigner3j.m create mode 100644 BasicWLC/dssWLC/getparams/cofactor.m create mode 100644 BasicWLC/dssWLC/getparams/dssWLCcalcparams.m create mode 100644 BasicWLC/dssWLC/getparams/dssWLCgetParams.m create mode 100644 BasicWLC/dssWLC/getparams/dssWLClengthScale.m create mode 100644 BasicWLC/dssWLC/getparams/dssWLCminLpParams.m create mode 100644 BasicWLC/dssWLC/getparams/dssWLCmoments.m create mode 100644 BasicWLC/dssWLC/getparams/dssWLCparams.txt create mode 100644 BasicWLC/dssWLC/getparams/dssWLCstructFact.m create mode 100644 BasicWLC/dssWLC/getparams/expandFsph.m create mode 100644 BasicWLC/dssWLC/getparams/getYcouple.m create mode 100644 BasicWLC/dssWLC/getparams/ljind.m create mode 100644 BasicWLC/dssWLC/getparams/ljindinv.m create mode 100644 BasicWLC/dssWLC/getparams/shearWLCgetAmat.m create mode 100644 BasicWLC/dssWLC/getparams/shearWLCpropagator.m create mode 100644 BasicWLC/dssWLC/getparams/ssWLCdynamics.m create mode 100644 BasicWLC/dssWLC/getparams/tabulateparams.m create mode 100644 BasicWLC/dssWLC/getparams/testrun.m create mode 100644 BasicWLC/dssWLC/scripts/pdbutils.py create mode 100644 BasicWLC/dssWLC/scripts/pdbutils.pyc create mode 100644 BasicWLC/dssWLC/scripts/snapshot2pdb.py create mode 100644 BasicWLC/dssWLC/scripts/viewsnapshots.pml create mode 100644 BasicWLC/dssWLC/shearableWLC.exe create mode 100644 BasicWLC/dssWLC/source/Makefile create mode 100644 BasicWLC/dssWLC/source/a0boundfunc.f90 create mode 100644 BasicWLC/dssWLC/source/besselI0.f90 create mode 100644 BasicWLC/dssWLC/source/bessfin.f90 create mode 100644 BasicWLC/dssWLC/source/browndyn.f90 create mode 100644 BasicWLC/dssWLC/source/chainutil.f90 create mode 100644 BasicWLC/dssWLC/source/cylinder.f90 create mode 100644 BasicWLC/dssWLC/source/dbrent.f90 create mode 100644 BasicWLC/dssWLC/source/dgtsl.f create mode 100644 BasicWLC/dssWLC/source/genutil.f90 create mode 100644 BasicWLC/dssWLC/source/inputparams.f90 create mode 100644 BasicWLC/dssWLC/source/inpututil.f90 create mode 100644 BasicWLC/dssWLC/source/keys.f90 create mode 100644 BasicWLC/dssWLC/source/main.f90 create mode 100644 BasicWLC/dssWLC/source/manychains.f90 create mode 100644 BasicWLC/dssWLC/source/montecarlo.f90 create mode 100644 BasicWLC/dssWLC/source/mt19937.f90 create mode 100644 BasicWLC/dssWLC/source/nrtype.f90 create mode 100644 BasicWLC/dssWLC/source/nrutils.f90 create mode 100644 BasicWLC/dssWLC/source/quartic.f create mode 100644 BasicWLC/dssWLC/source/quatutil.f90 create mode 100644 BasicWLC/dssWLC/source/ranlib.f90 create mode 100644 BasicWLC/dssWLC/source/readkey.f90 create mode 100644 BasicWLC/dssWLC/source/redisc.f90 create mode 100644 BasicWLC/dssWLC/source/sampleutil.f90 create mode 100644 BasicWLC/dssWLC/source/test.f90 create mode 100644 BasicWLC/dssWLC/source/testmain.f90 create mode 100644 BasicWLC/tests/test_sort.f90 create mode 100644 BasicWLC/third_party/DGTSL.f create mode 100644 BasicWLC/third_party/dgtsv.f create mode 100644 BasicWLC/third_party/kdtree2.f90 create mode 100644 BasicWLC/third_party/mt19937.f90 create mode 100644 BasicWLC/third_party/qsort_inline.inc create mode 100644 BasicWLC/third_party/qsort_inline_index.inc create mode 100644 BasicWLC/third_party/sort.f90 diff --git a/BasicWLC/BDcode/BDsim.f90 b/BasicWLC/BDcode/BDsim.f90 new file mode 100644 index 00000000..cab31048 --- /dev/null +++ b/BasicWLC/BDcode/BDsim.f90 @@ -0,0 +1,315 @@ +!---------------------------------------------------------------* + + SUBROUTINE BDsim(R,U,NT,N,NP,TIME,TTOT,DT,BROWN, & + INTON,IDUM,PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST, & + COL_TYPE, METH_STATUS, KM, KD, NUM_SPREAD, IN_RXN_RAD, PAIRS, NUC_SITE, NUM_METHYLATED, NUM_DECAY) + +! +! External subroutine to perform a Brownian dynamics simulation. +! +! Andrew Spakowitz +! Written 11-11-13 + + use mt19937, only : rnorm + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION TIME ! Time of BD simulation + DOUBLE PRECISION TTOT ! Final time of BD simulation + INTEGER N,NP,NT ! Number of beads + +! Variables in the simulation + + DOUBLE PRECISION B(NT,1) ! Bond length + DOUBLE PRECISION RS(NT,3) ! R during the step + DOUBLE PRECISION US(NT,3) ! R during the step + DOUBLE PRECISION L0 ! Bond distances + DOUBLE PRECISION DT,DT0 ! Time step size + INTEGER RK ! Runge-Kutta index + DOUBLE PRECISION DRDT(NT,3,4) ! Position rate of change + DOUBLE PRECISION DUDT(NT,3,4) ! Position rate of change + INTEGER I,J,IB ! Index Holders + DOUBLE PRECISION DOTU + DOUBLE PRECISION R0(3) + +! Variables for use in the force calculations + + DOUBLE PRECISION FELAS(NT,3) ! Elastic force + DOUBLE PRECISION FPONP(NT,3) ! self-int force + DOUBLE PRECISION TELAS(NT,3) ! Elastic force + DOUBLE PRECISION TPONP(NT,3) ! self-int force + DOUBLE PRECISION FORCE ! External force + INTEGER FON ! Is force on? + +! Variables in the simulation + + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + DOUBLE PRECISION XIR,XIU + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION LHC ! Length of HC int + DOUBLE PRECISION VHC ! HC strength + DOUBLE PRECISION PARA(10) + INTEGER SIMTYPE ! Simulation method (WLC=1,SSWLC=2,GC=3) + +! Variables used for the Brownian forces + + DOUBLE PRECISION FRAND(NT,3) ! Random force + DOUBLE PRECISION TRAND(NT,3) ! Random force + DOUBLE PRECISION MAGR,MAGU ! Mag of Brownian forces + INTEGER BROWN ! Logic for BD forces + INTEGER INTON ! Include polymer interactions + REAL ran1 ! Random number generator + INTEGER IDUM ! Seed for the generator + INTEGER NOW(3) ! Time now (hr,min,sec) + +! Variables for the timestep switch + + INTEGER SWDT + +! Variable to hold time of first collisions between each bead + DOUBLE PRECISION HAS_COLLIDED(NT,NT) + DOUBLE PRECISION FPT_DIST ! l1 dist to trigger collision + INTEGER COL_TYPE ! algorithm to use for collision detection + +! Variables for tracking methylation profile + INTEGER IN_RXN_RAD(NT,NT) ! is pair of sites within reaction radius? 1 = yes, 0 = no + INTEGER METH_STATUS(NT) ! methylation status of each site: 1 = methylated, 0 = unmethylated + INTEGER COULD_REACT ! number of pairs that meet criteria for reaction (i.e. within reaction radius, one bead methylated, one bead unmethylated) + INTEGER PAIRS(2,NT) ! array that holds indices of sites that could react + INTEGER RXN_HAPPEN ! reaction status: 1 = reaction, 0 = no reaction + DOUBLE PRECISION KM ! rate of methylation + DOUBLE PRECISION KD ! rate of demethylation + DOUBLE PRECISION KTOT ! total rate constant + INTEGER NUM_METHYLATED ! number of methylated sites + INTEGER NUM_SPREAD ! total number of spreading events + INTEGER NUC_SITE ! index of nucleation site + INTEGER NUM_DECAY ! total number of decay events + DOUBLE PRECISION DT_MOD ! time remaining in timestep for Gillespie algorithm + +! Load the input parameters + + EB=PARA(1) + EPAR=PARA(2) + EPERP=PARA(3) + GAM=PARA(4) + ETA=PARA(5) + XIR=PARA(6) + XIU=PARA(7) + LBOX=PARA(8) + LHC=PARA(9) + VHC=PARA(10) + + MAGR=sqrt(XIR*2.0/DT) + MAGU=sqrt(XIU*2.0/DT) + DT0=DT + SWDT=0 + +! Setup the geometric parameters and initialize random forces + + IB=1 + DO 10 I=1,NP + DO 20 J=1,N + RS(IB,1)=R(IB,1) + RS(IB,2)=R(IB,2) + RS(IB,3)=R(IB,3) + US(IB,1)=U(IB,1) + US(IB,2)=U(IB,2) + US(IB,3)=U(IB,3) + FELAS(IB,1)=0. + FELAS(IB,2)=0. + FELAS(IB,3)=0. + FRAND(IB,1)=0. + FRAND(IB,2)=0. + FRAND(IB,3)=0. + FPONP(IB,1)=0. + FPONP(IB,2)=0. + FPONP(IB,3)=0. + TELAS(IB,1)=0. + TELAS(IB,2)=0. + TELAS(IB,3)=0. + TRAND(IB,1)=0. + TRAND(IB,2)=0. + TRAND(IB,3)=0. + TPONP(IB,1)=0. + TPONP(IB,2)=0. + TPONP(IB,3)=0. + IB=IB+1 + 20 CONTINUE + 10 CONTINUE + + RXN_HAPPEN = 1 + +! Begin the time integration + + DO WHILE (TIME.LT.TTOT) + + call CHECK_COLLISIONS(R, NT, HAS_COLLIDED, FPT_DIST, TIME, COL_TYPE, IN_RXN_RAD) + + DT_MOD = DT + + DO WHILE (RXN_HAPPEN.EQ.1) + + COULD_REACT = 0 + + call CHECK_REACTIONS(R, NT, METH_STATUS, IN_RXN_RAD, COULD_REACT, FPT_DIST, PAIRS) + + call TOT_RATE_CONSTANT(NT, COULD_REACT, METH_STATUS, KM, KD, KTOT, NUM_METHYLATED) + + call METHYL_PROFILE(NT,METH_STATUS,KTOT,KM,KD,NUM_METHYLATED,TIME, & + RXN_HAPPEN,PAIRS,DT,DT_MOD,NUC_SITE,NUM_SPREAD,NUM_DECAY) + + END DO + + RXN_HAPPEN = 1 + +! Calculate the random forces and torques for use in this +! timestep calculation if BROWN=1 + + RK=1 + DO WHILE (RK.LE.4) + + 130 CONTINUE + + if (BROWN.EQ.1.AND.RK.EQ.1) then + IB=1 + DO 30 I=1,NP + DO 40 J=1,N + FRAND(IB,1)=MAGR*rnorm() + FRAND(IB,2)=MAGR*rnorm() + FRAND(IB,3)=MAGR*rnorm() + TRAND(IB,1)=MAGU*rnorm() + TRAND(IB,2)=MAGU*rnorm() + TRAND(IB,3)=MAGU*rnorm() + IB=IB+1 + 40 CONTINUE + 30 CONTINUE + endif + +! Calculate the four Runge-Kutta derivatives + + +! Calculate the elastic forces (same as free chain) + + call force_elas(FELAS,TELAS,R,U,NT,N,NP,EB,EPAR,EPERP,GAM,ETA,SIMTYPE) + +! Calculate the self forces + + if (INTON.EQ.1) then + call force_ponp(FPONP,R,NT,N,NP,LHC,VHC,LBOX,GAM,DT,XIR,SWDT) + +! If timestep is switch, reset coords and redo step + + if (SWDT.EQ.1) then + print*, "Time-step switch", DT,RK,TIME + SWDT=0 + MAGR=sqrt(XIR*2.0/DT) + MAGU=sqrt(XIU*2.0/DT) + IB=1 + DO 60 I=1,NP + DO 65 J=1,N + R(IB,1)=RS(IB,1) + R(IB,2)=RS(IB,2) + R(IB,3)=RS(IB,3) + U(IB,1)=US(IB,1) + U(IB,2)=US(IB,2) + U(IB,3)=US(IB,3) + IB=IB+1 + 65 CONTINUE + 60 CONTINUE + RK=1 + goto 130 + endif + endif + + +! Calculate the change in the position vector + + IB=1 + DO 70 I=1,NP + DO 80 J=1,N + DRDT(IB,1,RK)=(FELAS(IB,1)+FPONP(IB,1))/XIR + DRDT(IB,2,RK)=(FELAS(IB,2)+FPONP(IB,2))/XIR + DRDT(IB,3,RK)=(FELAS(IB,3)+FPONP(IB,3))/XIR + DUDT(IB,1,RK)=(TELAS(IB,1)+TPONP(IB,1))/XIU + DUDT(IB,2,RK)=(TELAS(IB,2)+TPONP(IB,2))/XIU + DUDT(IB,3,RK)=(TELAS(IB,3)+TPONP(IB,3))/XIU + + if (BROWN.EQ.0) then + DOTU=DUDT(IB,1,RK)*U(IB,1)+DUDT(IB,2,RK)*U(IB,2)+DUDT(IB,3,RK)*U(IB,3) + DUDT(IB,1,RK)=DUDT(IB,1,RK)-DOTU*U(IB,1) + DUDT(IB,2,RK)=DUDT(IB,2,RK)-DOTU*U(IB,2) + DUDT(IB,3,RK)=DUDT(IB,3,RK)-DOTU*U(IB,3) + endif + IB=IB+1 + 80 CONTINUE + 70 CONTINUE + + if (BROWN.EQ.1) then + IB=1 + DO 90 I=1,NP + DO 100 J=1,N + DRDT(IB,1,RK)=DRDT(IB,1,RK)+FRAND(IB,1)/XIR + DRDT(IB,2,RK)=DRDT(IB,2,RK)+FRAND(IB,2)/XIR + DRDT(IB,3,RK)=DRDT(IB,3,RK)+FRAND(IB,3)/XIR + DUDT(IB,1,RK)=DUDT(IB,1,RK)+TRAND(IB,1)/XIU + DUDT(IB,2,RK)=DUDT(IB,2,RK)+TRAND(IB,2)/XIU + DUDT(IB,3,RK)=DUDT(IB,3,RK)+TRAND(IB,3)/XIU + + DOTU=DUDT(IB,1,RK)*U(IB,1)+DUDT(IB,2,RK)*U(IB,2)+DUDT(IB,3,RK)*U(IB,3) + DUDT(IB,1,RK)=DUDT(IB,1,RK)-DOTU*U(IB,1) + DUDT(IB,2,RK)=DUDT(IB,2,RK)-DOTU*U(IB,2) + DUDT(IB,3,RK)=DUDT(IB,3,RK)-DOTU*U(IB,3) + + IB=IB+1 + 100 CONTINUE + 90 CONTINUE + endif + +! If SIMTYPE=1 (WLC), calculate the constraint forces + + if (SIMTYPE.EQ.1) then + call concalc(R,DRDT,NT,N,NP,XIR,GAM,DT,RK,BROWN) + endif + +! Step forward using the RK algorithm + + call RKstep(RS,R,US,U,DRDT,DUDT,NT,N,NP,RK,DT) + + RK=RK+1 + + ENDDO + + TIME=TIME+DT + +! Swap old variables for new ones + + DT=DT0 + MAGR=sqrt(XIR*2.0/DT) + MAGU=sqrt(XIU*2.0/DT) + + IB=1 + DO 110 I=1,NP + R0(1)=nint(R(IB,1)/LBOX-0.5)*LBOX + R0(2)=nint(R(IB,2)/LBOX-0.5)*LBOX + R0(3)=nint(R(IB,3)/LBOX-0.5)*LBOX + DO 120 J=1,N + R(IB,1)=R(IB,1)-R0(1) + R(IB,2)=R(IB,2)-R0(2) + R(IB,3)=R(IB,3)-R0(3) + RS(IB,1)=R(IB,1) + RS(IB,2)=R(IB,2) + RS(IB,3)=R(IB,3) + US(IB,1)=U(IB,1) + US(IB,2)=U(IB,2) + US(IB,3)=U(IB,3) + IB=IB+1 + 120 CONTINUE + 110 CONTINUE + + ENDDO + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/BDcode/RKstep.f90 b/BasicWLC/BDcode/RKstep.f90 new file mode 100644 index 00000000..70753804 --- /dev/null +++ b/BasicWLC/BDcode/RKstep.f90 @@ -0,0 +1,72 @@ +!---------------------------------------------------------------* + +! +! This subroutine performs the RK step for user inputted timestep +! size +! +! Andrew Spakowitz +! Written 6-6-04 + + SUBROUTINE RKstep(RS,R,US,U,DRDT,DUDT,NT,N,NP,RK,DT) + + PARAMETER (PI=3.141592654) ! Value of pi + + DOUBLE PRECISION RS(NT,3) ! Saved bead positions + DOUBLE PRECISION R(NT,3) ! Temp bead positions + DOUBLE PRECISION US(NT,3) ! Unit tangent + DOUBLE PRECISION U(NT,3) ! Unit tangent + DOUBLE PRECISION DRDT(NT,3,4) ! Change rate of beads + DOUBLE PRECISION DUDT(NT,3,4) ! Change rate of beads + DOUBLE PRECISION DT ! Time step size + INTEGER N,NT ! Bead numbers + INTEGER RK ! RK number + INTEGER I,J,IB ! Index number + DOUBLE PRECISION MAGU + + IB=1 + DO 10 I=1,NP + DO 20 J=1,N + if(RK.EQ.1) then + R(IB,1)=RS(IB,1)+DT*DRDT(IB,1,RK)/2. + R(IB,2)=RS(IB,2)+DT*DRDT(IB,2,RK)/2. + R(IB,3)=RS(IB,3)+DT*DRDT(IB,3,RK)/2. + U(IB,1)=US(IB,1)+DT*DUDT(IB,1,RK)/2. + U(IB,2)=US(IB,2)+DT*DUDT(IB,2,RK)/2. + U(IB,3)=US(IB,3)+DT*DUDT(IB,3,RK)/2. + elseif(RK.EQ.2) then + R(IB,1)=RS(IB,1)+DT*DRDT(IB,1,RK)/2. + R(IB,2)=RS(IB,2)+DT*DRDT(IB,2,RK)/2. + R(IB,3)=RS(IB,3)+DT*DRDT(IB,3,RK)/2. + U(IB,1)=US(IB,1)+DT*DUDT(IB,1,RK)/2. + U(IB,2)=US(IB,2)+DT*DUDT(IB,2,RK)/2. + U(IB,3)=US(IB,3)+DT*DUDT(IB,3,RK)/2. + elseif(RK.EQ.3) then + R(IB,1)=RS(IB,1)+DT*DRDT(IB,1,RK) + R(IB,2)=RS(IB,2)+DT*DRDT(IB,2,RK) + R(IB,3)=RS(IB,3)+DT*DRDT(IB,3,RK) + U(IB,1)=US(IB,1)+DT*DUDT(IB,1,RK) + U(IB,2)=US(IB,2)+DT*DUDT(IB,2,RK) + U(IB,3)=US(IB,3)+DT*DUDT(IB,3,RK) + elseif(RK.EQ.4) then + R(IB,1)=RS(IB,1)+DT*(DRDT(IB,1,1)/6.+DRDT(IB,1,2)/3.+DRDT(IB,1,3)/3.+DRDT(IB,1,4)/6.) + R(IB,2)=RS(IB,2)+DT*(DRDT(IB,2,1)/6.+DRDT(IB,2,2)/3.+DRDT(IB,2,3)/3.+DRDT(IB,2,4)/6.) + R(IB,3)=RS(IB,3)+DT*(DRDT(IB,3,1)/6.+DRDT(IB,3,2)/3.+DRDT(IB,3,3)/3.+DRDT(IB,3,4)/6.) + U(IB,1)=US(IB,1)+DT*(DUDT(IB,1,1)/6.+DUDT(IB,1,2)/3.+DUDT(IB,1,3)/3.+DUDT(IB,1,4)/6.) + U(IB,2)=US(IB,2)+DT*(DUDT(IB,2,1)/6.+DUDT(IB,2,2)/3.+DUDT(IB,2,3)/3.+DUDT(IB,2,4)/6.) + U(IB,3)=US(IB,3)+DT*(DUDT(IB,3,1)/6.+DUDT(IB,3,2)/3.+DUDT(IB,3,3)/3.+DUDT(IB,3,4)/6.) + endif + + MAGU=sqrt(U(IB,1)**2.+U(IB,2)**2.+U(IB,3)**2.) + U(IB,1)=U(IB,1)/MAGU + U(IB,2)=U(IB,2)/MAGU + U(IB,3)=U(IB,3)/MAGU + + IB=IB+1 + 20 CONTINUE + 10 CONTINUE + + RETURN + END + +!---------------------------------------------------------------* + diff --git a/BasicWLC/BDcode/calc_dist.f90 b/BasicWLC/BDcode/calc_dist.f90 new file mode 100644 index 00000000..b0fd5c9b --- /dev/null +++ b/BasicWLC/BDcode/calc_dist.f90 @@ -0,0 +1,20 @@ +subroutine calc_dist(r,nt,fpt_dist,in_rxn_rad,k1,k2) + implicit none + integer :: i + double precision :: d, distance + integer, intent(in) :: nt, in_rxn_rad(nt,nt), k1 + double precision, intent(in) :: r(nt,3), fpt_dist + integer,intent(out) :: k2 + ! when more than 2 beads are within reaction distance, find the 2 that are closest together + distance = fpt_dist + do i = 1, nt + if ((in_rxn_rad(k1,i).eq.1) .and. (k1.ne.i)) then + d = sqrt(((r(k1,1)-r(i,1))**2)+((r(k1,2)-r(i,2))**2)+((r(k1,3)-r(i,3))**2)) + if (d.lt.distance) then + distance = d + k2 = i + end if + end if + end do +end + diff --git a/BasicWLC/BDcode/check_reactions.f90 b/BasicWLC/BDcode/check_reactions.f90 new file mode 100644 index 00000000..157e1d4b --- /dev/null +++ b/BasicWLC/BDcode/check_reactions.f90 @@ -0,0 +1,58 @@ +subroutine check_reactions(r, nt, meth_status, in_rxn_rad, could_react, fpt_dist, pairs) + implicit none + integer, intent(in) :: meth_status(nt) + double precision, intent(inout) :: r(nt,3), fpt_dist + double precision :: check_pair(nt,nt) + integer, intent(inout) :: could_react, nt, in_rxn_rad(nt,nt), pairs(2,nt) + integer :: k1,k2 + + ! initialize variables + do k1 = 1, nt + do k2 = 1, nt + check_pair(k1,k2) = 0 + end do + end do + + do k1 = 1, nt + pairs(1,k1) = 0 + pairs(2,k1) = 0 + end do + + ! for pairs of beads that are close enough to react, check that one + ! is methylated and one unmethylated + do k1 = 1, nt + if (sum(in_rxn_rad(k1,:)).eq.1) then + k2 = maxloc(in_rxn_rad(k1,:),1) + if (check_pair(k1,k2).eq.0) then + check_pair(k1,k2) = 1 + check_pair(k2,k1) = 1 + if (meth_status(k1).eq.1 .and. meth_status(k2).eq.0) then + could_react = could_react + 1 + pairs(1,could_react) = k1 + pairs(2,could_react) = k2 + else if (meth_status(k1).eq.0 .and. meth_status(k2).eq.1) then + could_react = could_react + 1 + pairs(1,could_react) = k2 + pairs(2,could_react) = k1 + end if + end if + else if (sum(in_rxn_rad(k1,:)).gt.1) then + call calc_dist(r,nt,fpt_dist,in_rxn_rad,k1,k2) + if (check_pair(k1,k2).eq.0) then + check_pair(k1,k2) = 1 + check_pair(k2,k1) = 1 + if ((meth_status(k1).eq.1) .and. (meth_status(k2).eq.0)) then + could_react = could_react + 1 + pairs(1,could_react) = k1 + pairs(2,could_react) = k2 + else if ((meth_status(k1).eq.0) .and. (meth_status(k2).eq.1)) then + could_react = could_react + 1 + pairs(1,could_react) = k2 + pairs(2,could_react) = k1 + end if + end if + end if + end do +end + + diff --git a/BasicWLC/BDcode/colchecker.f90 b/BasicWLC/BDcode/colchecker.f90 new file mode 100644 index 00000000..8b5c4bcc --- /dev/null +++ b/BasicWLC/BDcode/colchecker.f90 @@ -0,0 +1,266 @@ + +subroutine insertion_sort(n,a) + implicit none + integer n,i,j + double precision a(n),x + do 30 i=2,n + x=a(i) + j=i +10 j=j-1 + if (j.eq.0 .or. a(j).le.x) go to 20 + a(j+1)=a(j) + go to 10 +20 a(j+1)=x +30 continue +end + +subroutine check_collisions(r, nt, has_collided, fpt_dist, time, col_type, in_rxn_rad) + implicit none + integer, intent(in) :: nt, col_type + double precision, intent(in) :: fpt_dist, time + double precision, intent(in) :: r(nt,3) + double precision, intent(inout) :: has_collided(nt, nt) + integer, intent(inout) :: in_rxn_rad(nt,nt) + + if (col_type.eq.0) then + return + else if (col_type.eq.1) then + call check_collisions_brute(r, nt, has_collided, fpt_dist, time, in_rxn_rad) + else if (col_type.eq.2) then + call check_collisions_kd(r, nt, has_collided, fpt_dist, time) + else if (col_type.eq.3) then + call check_collisions_bb(r, nt, has_collided, fpt_dist, time, in_rxn_rad) + end if +end + +subroutine check_collisions_brute(r, nt, has_collided, fpt_dist, & + time, in_rxn_rad) + implicit none + + integer, intent(in) :: nt + integer k1, k2 + double precision, intent(in) :: fpt_dist, time, r(nt,3) + double precision, intent(inout) :: has_collided(nt, nt) + integer, intent(inout) :: in_rxn_rad(nt,nt) + + + !integer nt, in_rxn_rad(nt,nt),k1,k2 + !double precision fpt_dist, time + !double precision r(nt,3), has_collided(nt, nt) + + ! initialize in_rxn_rad + do k1 = 1, nt + do k2 = 1, nt + in_rxn_rad(k1,k2) = 0 + end do + end do + + ! check if the particles have collided + do k1 = 1, nt + do k2 = 1, nt + if ((k1.ne.k2) & + .and. (abs(r(k1,1) - r(k2,1)) < fpt_dist) & + .and. (abs(r(k1,2) - r(k2,2)) < fpt_dist) & + .and. (abs(r(k1,3) - r(k2,3)) < fpt_dist)) then + in_rxn_rad(k1,k2) = 1 + if (has_collided(k1,k2).lt.0.0d0) then + has_collided(k1,k2) = time + end if + end if + end do + end do +end + +subroutine check_collisions_kd(r, nt, has_collided, fpt_dist, time) + use kdtree2_module, only : kdtree2, kdtree2_result, kdtree2_create, & + kdtree2_r_nearest_around_point + implicit none + integer nt, nfound, nalloc, k1, k2, i, in_rxn_rad(nt,nt) + double precision fpt_dist, time + double precision r(nt,3), has_collided(nt, nt) + type(kdtree2), pointer :: col_tree + type(kdtree2_result), allocatable :: kd_results(:) + + ! initialize in_rxn_rad + do k1 = 1, nt + do k2 = 1, nt + in_rxn_rad(k1,k2) = 0 + end do + end do + + col_tree => kdtree2_create(r, rearrange = .true., sort = .false.) + do k1 = 1,nt + call kdtree2_r_nearest_around_point(col_tree, idxin = k1, & + correltime = 1, r2 = fpt_dist, nfound = nfound, nalloc = nalloc, & + results = kd_results) + do i = 1,nfound + k2 = kd_results(i)%idx + in_rxn_rad(k1,k2) = 1 + if (has_collided(k1,k2) .lt. 0) then + has_collided(k1,k2) = time + endif + enddo + enddo +end + +subroutine check_collisions_bb(r, nt, has_collided, fpt_dist, time, in_rxn_rad) +! at each time point, we want to have 2 "pointer arrays", ind & indi +! r(ind(:,k),k) is in order for k in 1,2,3 i.e. [~,ind(:,1)] = sort(r(:,1) +! ind(indi(i,k),k) == i for k in 1,2,3 +! at all time points +! +! acf means "after collision found" with ith bead in dimension d + use, intrinsic :: iso_fortran_env + implicit none + integer, parameter :: dp = REAL64 + + integer, intent(in) :: nt + double precision, intent(in) :: fpt_dist, time, r(nt,3) + double precision, intent(inout) :: has_collided(nt, nt) + integer, intent(inout) :: in_rxn_rad(nt,nt) + + integer :: neighbors(nt,nt) ! most of array won't be used, probably + ! neighbors(1:num_neighbors(i),i) holds neighbors of bead i for each i + ! acf: neighbors(?,i) = j iff found in all three (d == 3, neighbor_triplet_keeper(j) == 2/3) + integer :: num_neighbors(nt) ! to prevent O(nt^2) access to neighbors + ! acf: num_neighbors(i)++ iff found in all three (d == 3, neighbor_triplet_keeper(j) == 2/3) + integer :: neighbor_triplet_keeper(nt) ! O(nt)-space "hash table" + ! every time we find that bead j is a neighbor in one of the three + ! dimensions, then we increment neighbor_triplet_keeper(j), until we + ! realize it's not a neighbor in one of the dimensions, or that it is + ! in all three + ! acf: neighbor_triplet_keeper(j)++ + integer :: neighbor_zeroer(nt), num_zeros ! to zero out "hash table" quickly + ! reports that neighbor_triplet_keeper(neighbor_zeroer(1:num_zeros)) + ! should be zeroed after checking for all the neighbors of a particular + ! bead + ! acf: neighbor_zeroer(++num_zeros) = j if neighbor_triplet_keeper == 0/1 + ! better: "" "" if d == 1 (i.e. we're adding j to triplet array) + integer, save, allocatable, dimension(:,:) :: ind, indi + integer, save :: is_allocated = 0 ! "static" variable, allow initial setup + integer :: curr_indi, curr_ind, i, j, d, rd0, k1, k2 + double precision :: rneighbor + + ! initialize in_rxn_rad + do k1 = 1, nt + do k2 = 1, nt + in_rxn_rad(k1,k2) = 0 + end do + end do + + ! initialize ind and indi on first pass, requires O(n log n) sort + if (is_allocated == 0) then + is_allocated = 1 + allocate(ind(nt,3)) + allocate(indi(nt,3)) + do d = 1, 3 + do i = 1, nt + ind(i,d) = i + indi(i,d) = i + enddo + call qcolsort(nt, indi(:,d), ind(:,d), r(:,d)) + enddo + ! ind and indi should satisfy desired property + else + do d = 1, 3 + call icolsort(nt, indi(:,d), ind(:,d), r(:,d)) + enddo + endif + ! initialize loop variables + num_zeros = 0 + do i = 1, nt + num_neighbors(i) = 0 + neighbor_triplet_keeper(i) = 0 + neighbor_zeroer(i) = 0 + enddo + ! fills neighbors(:,i) with num_neighbors(i) indices of particles that the + ! ith particle has collided with + do i = 1, nt + ! look at three dimensions one-by-one + do d = 1, 3 + curr_indi = indi(i,d) + curr_ind = ind(curr_indi,d) + rd0 = r(curr_ind,d) + ! first we're going to look for particles to the "right" + j = 1 + if (curr_indi == nt) exit + curr_ind = ind(curr_indi + j,d) + rneighbor = r(curr_ind,d) + do while (rneighbor < rd0 + fpt_dist) +! on the first pass, just mark that a collision happened in this coord +! then mark that index in the "hash table" as "needs zeroing" + if (d == 1) then + num_zeros = num_zeros + 1 + neighbor_zeroer(num_zeros) = curr_ind + ! basically do: neighbor_triplet_keeper(curr_ind) = neighbor_triplet_keeper(curr_ind) + 1 + neighbor_triplet_keeper(curr_ind) = 1 +! on the second pass, only mark if it also happened on the first pass + elseif (d == 2) then + if (neighbor_triplet_keeper(curr_ind) == 1) then + ! basically do: neighbor_triplet_keeper(curr_ind) = neighbor_triplet_keeper(curr_ind) + 1 + neighbor_triplet_keeper(curr_ind) = 2 + endif +! on the third pass, make the ones that have hit the official colliders + else ! (d == 3) + if (neighbor_triplet_keeper(curr_ind) == 2) then + num_neighbors(i) = num_neighbors(i) + 1 + neighbors(num_neighbors(i),i) = curr_ind + endif + endif + j = j + 1 + if (curr_indi + j > nt) exit + curr_ind = ind(curr_indi + j,d) + rneighbor = r(curr_ind,d) + enddo + ! now we look for particles to the "left" + j = 1 + if (curr_indi == 1) exit + curr_ind = ind(curr_indi - j,d) + rneighbor = r(curr_ind,d) + do while (rneighbor > rd0 - fpt_dist) +! on the first pass, just mark that a collision happened in this coord +! then mark that index in the "hash table" as "needs zeroing" + if (d == 1) then + num_zeros = num_zeros + 1 + neighbor_zeroer(num_zeros) = curr_ind + ! basically do: neighbor_triplet_keeper(curr_ind) = neighbor_triplet_keeper(curr_ind) + 1 + neighbor_triplet_keeper(curr_ind) = 1 +! on the second pass, only mark if it also happened on the first pass + elseif (d == 2) then + if (neighbor_triplet_keeper(curr_ind) == 1) then + ! basically do: neighbor_triplet_keeper(curr_ind) = neighbor_triplet_keeper(curr_ind) + 1 + neighbor_triplet_keeper(curr_ind) = 2 + endif +! on the third pass, make the ones that have hit the official colliders + else ! (d == 3) + if (neighbor_triplet_keeper(curr_ind) == 2) then + num_neighbors(i) = num_neighbors(i) + 1 + neighbors(num_neighbors(i),i) = curr_ind + endif + endif + j = j + 1 + if (curr_indi - j < 1) exit + curr_ind = ind(curr_indi - j,d) + rneighbor = r(curr_ind,d) + enddo + enddo + ! zero out the "hash table" + ! might be faster to sort neighbors to zero or zero entire thing for small nt? + ! should probably check this at some point + do j = 1, num_zeros + neighbor_triplet_keeper(neighbor_zeroer(j)) = 0 + enddo + num_zeros = 0 + enddo + ! from the neighbors, num_neighbors arrays, we can rapidly extract + ! exactly those elements that have collided + ! neighbors(neighborj, beadi), num_neighbors(beadi) + do i = 1, nt + do j = 1, num_neighbors(i) + in_rxn_rad(i,neighbors(j,i)) = 1 + if (has_collided(neighbors(j,i),i) < 0.0_dp) then + has_collided(neighbors(j,i),i) = time + endif + enddo + enddo +end diff --git a/BasicWLC/BDcode/colsort.f90 b/BasicWLC/BDcode/colsort.f90 new file mode 100644 index 00000000..ed90cda1 --- /dev/null +++ b/BasicWLC/BDcode/colsort.f90 @@ -0,0 +1,43 @@ +!--------------------------------------------------------------- +! Sort an index-array and an index-index array by a double array target +!--------------------------------------------------------------- + +! use quicksort +subroutine qcolsort(array_size, indexi, index, value) + implicit none + integer, parameter :: dp = selected_real_kind(15, 307) + integer, parameter :: QSORT_THRESHOLD = 32 + integer, intent(in) :: array_size + integer, intent(inout) :: index(array_size) + integer, intent(inout) :: indexi(array_size) + real(dp), intent(in) :: value(array_size) + + include "qsort_inline.inc" +contains + include "colsort.inc" +end subroutine qcolsort + +! use insertion sort +subroutine icolsort(array_size, indexi, index, value) + implicit none + integer, parameter :: dp = selected_real_kind(15, 307) + integer, intent(in) :: array_size + integer, intent(inout) :: index(array_size) + integer, intent(inout) :: indexi(array_size) + real(dp), intent(in) :: value(array_size) + + integer :: left, right + do right = 2, array_size + left = right - 1 + if (less_than(right, left)) then + do ! need two separate if's since fortran has no short circuit "&&" + if (left < 2) exit + if (.NOT.less_than(right, left - 1)) exit + left = left - 1 + enddo + call rshift(left, right) + endif + enddo +contains + include "colsort.inc" +end subroutine icolsort diff --git a/BasicWLC/BDcode/colsort.inc b/BasicWLC/BDcode/colsort.inc new file mode 100644 index 00000000..13d8c332 --- /dev/null +++ b/BasicWLC/BDcode/colsort.inc @@ -0,0 +1,56 @@ +! helper routines for sorting an array ind based on an array r, while keeping a +! third array indi such that: +! r(ind(:,k),k) is in order for k in 1,2,3 i.e. [~,ind(:,1)] = sort(r(:,1) +! ind(indi(i,k),k) == i for k in 1,2,3 +! (indi(:,k) == indexi, ind(:,k) == index, r(:,k) == value +! +! in reasoning about the following, it is useful to note that ind and indi as +! functions from 1,n to 1,n are inverses: indi(ind(i)) == i && ind(indi(i)) == i + + ! do-nothing initialization routine required for qsort_inline.inc + subroutine init() + end subroutine init + + ! swap indices a,b + subroutine swap(a,b) + ! less_than(index(a),index(b)) will lead to a swap + integer, intent(in) :: a,b + integer :: hold + hold=index(a) + index(a)=index(b) + index(b)=hold + ! easy to see this is what you want if you know you want to make + ! indexi the inverse of index (as a function from N to N) + indexi(index(a)) = a + indexi(index(b)) = b + end subroutine swap + + ! circular shift-right by one: + subroutine rshift(left,right) + implicit none + integer, intent(in) :: left, right + integer :: hold, i + hold=index(right) + ! This syntax is valid, but has poor optimization in GFortran: + ! index(left+1:right)=index(left:right-1) + do i=right,left+1,-1 + index(i)=index(i-1) + end do + index(left)=hold + do i=left,right + indexi(index(i)) = indexi(index(i)) + 1 + end do + indexi(hold) = left + end subroutine rshift + + ! fuzzy comparator prevents unecessary switching in super-fine time steps + logical & + function less_than(a,b) + integer, intent(in) :: a,b +! real(dp), parameter :: small=1.0e-15 +! if ( abs(value(index(a))-value(index(b))) < small ) then +! less_than = index(a) < index(b) +! else + less_than = value(index(a)) < value(index(b)) +! end if + end function less_than diff --git a/BasicWLC/BDcode/concalc.f90 b/BasicWLC/BDcode/concalc.f90 new file mode 100644 index 00000000..f00f5156 --- /dev/null +++ b/BasicWLC/BDcode/concalc.f90 @@ -0,0 +1,176 @@ +!---------------------------------------------------------------* + +! +! This subroutine performs the constraint forces +! +! Andrew Spakowitz +! Written 9-8-04 + + SUBROUTINE concalc(R,DRDT,NT,N,NP,XI,L0,DT,RK,BROWN) + +! Variables from the simulation + + DOUBLE PRECISION DRDT(NT,3,4) ! Rate of change + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(N-1,3) ! Unit tangent vector + DOUBLE PRECISION B(N-1) ! Bond length + INTEGER N,NT,NP ! Number of beads + DOUBLE PRECISION DT ! Time step size + DOUBLE PRECISION XI ! Drag coefficient + DOUBLE PRECISION L0 ! Bond distances + INTEGER I,J,IB ! Index holder + INTEGER RK ! RK integer + INTEGER BROWN ! Logic for BD forces + +! Variables for use in the constraint calculation + + DOUBLE PRECISION BLAM(N-1),ADIAG(N-1) + DOUBLE PRECISION ASUPER(N-1),ASUB(N-1) + DOUBLE PRECISION STDEV,C + INTEGER INFO + +! Variables of use in the pseudopotential calculation + + DOUBLE PRECISION FPS(N,3),APS(N-1),BPS(N-2) + DOUBLE PRECISION DETLT(N-1),DETGT(N-1),DETER + +! Relaxation parameter + + C = 0.1/DT + +! Calculate the bond length and tangent vectors + + DO 5 J=1,NP + IB=N*(J-1) + + DO 10 I=1,(N-1) + U(I,1)=R(I+IB+1,1)-R(I+IB,1) + U(I,2)=R(I+IB+1,2)-R(I+IB,2) + U(I,3)=R(I+IB+1,3)-R(I+IB,3) + B(I)=sqrt(U(I,1)**2.+U(I,2)**2.+U(I,3)**2.) + U(I,1)=U(I,1)/B(I) + U(I,2)=U(I,2)/B(I) + U(I,3)=U(I,3)/B(I) + 10 CONTINUE + +! Setup the A component + + DO 15 I=1,(N-1) + ADIAG(I) = 2.*B(I)*B(I) + if (BROWN.EQ.1) then + APS(I)=ADIAG(I) + endif + if (I.GE.2) then + ASUB(I)=-B(I)*B(I-1)*(U(I,1)*U(I-1,1)+ & + U(I,2)*U(I-1,2)+U(I,3)*U(I-1,3)) + ASUPER(I-1)=ASUB(I) + if (BROWN.EQ.1) then + BPS(I-1)=ASUPER(I-1) + endif + endif +15 CONTINUE + ASUB(1)=0. + ASUPER(N-1)=0. + +! Calculate psuedo-potential (if Brownian forces on) + + if (BROWN.EQ.1) then + DETLT(1)=1.0 + DETLT(2)=APS(1) + DETGT(N-1)=1.0 + DETGT(N-2)=APS(N-1) + DO 20 I=3,(N-1) + DETLT(I)=APS(I-1)*DETLT(I-1)- & + BPS(I-2)*BPS(I-2)*DETLT(I-2) + DETGT(N-I)=APS(N-I+1)*DETGT(N-I+1)- & + BPS(N-I+1)*BPS(N-I+1)*DETGT(N-I+2) + 20 CONTINUE + DETER=APS(N-1)*DETLT(N-1)-BPS(N-2)*BPS(N-2)*DETLT(N-2) + + FPS(1,1)=DETGT(2)*BPS(1)*B(2)*U(2,1)/DETER + FPS(1,2)=DETGT(2)*BPS(1)*B(2)*U(2,2)/DETER + FPS(1,3)=DETGT(2)*BPS(1)*B(2)*U(2,3)/DETER + FPS(2,1)=DETGT(2)*BPS(1)*(B(1)*U(1,1)- & + B(2)*U(2,1))/DETER+ & + DETGT(3)*APS(1)*BPS(2)*B(3)*U(3,1)/DETER + FPS(2,2)=DETGT(2)*BPS(1)*(B(1)*U(1,2)- & + B(2)*U(2,2))/DETER+ & + DETGT(3)*APS(1)*BPS(2)*B(3)*U(3,2)/DETER + FPS(2,3)=DETGT(2)*BPS(1)*(B(1)*U(1,3)- & + B(2)*U(2,3))/DETER+ & + DETGT(3)*APS(1)*BPS(2)*B(3)*U(3,3)/DETER + DO 30 I=3,(N-2) + FPS(I,1)=(DETLT(I-1)*DETGT(I)*BPS(I-1)*(-B(I)*U(I,1)+B(I-1)*U(I-1,1))+ & + DETLT(I-1)*DETGT(I+1)*APS(I-1)*BPS(I)*B(I+1)*U(I+1,1)- & + DETLT(I-2)*DETGT(I)*APS(I)*BPS(I-2)*B(I-2)*U(I-2,1)- & + DETLT(I-2)*DETGT(I+1)*( & + (BPS(I-2)**2.)*BPS(I)*B(I+1)*U(I+1,1)- & + (BPS(I)**2.)*BPS(I-2)*B(I-2)*U(I-2,1)))/DETER + FPS(I,2)=(DETLT(I-1)*DETGT(I)*BPS(I-1)*(-B(I)*U(I,2)+B(I-1)*U(I-1,2))+ & + DETLT(I-1)*DETGT(I+1)*APS(I-1)*BPS(I)*B(I+1)*U(I+1,2)- & + DETLT(I-2)*DETGT(I)*APS(I)*BPS(I-2)*B(I-2)*U(I-2,2)- & + DETLT(I-2)*DETGT(I+1)*( & + (BPS(I-2)**2.)*BPS(I)*B(I+1)*U(I+1,2)- & + (BPS(I)**2.)*BPS(I-2)*B(I-2)*U(I-2,2)))/DETER + FPS(I,3)=(DETLT(I-1)*DETGT(I)*BPS(I-1)*(-B(I)*U(I,3)+B(I-1)*U(I-1,3))+ & + DETLT(I-1)*DETGT(I+1)*APS(I-1)*BPS(I)*B(I+1)*U(I+1,3)- & + DETLT(I-2)*DETGT(I)*APS(I)*BPS(I-2)*B(I-2)*U(I-2,3)- & + DETLT(I-2)*DETGT(I+1)*( & + (BPS(I-2)**2.)*BPS(I)*B(I+1)*U(I+1,3)- & + (BPS(I)**2.)*BPS(I-2)*B(I-2)*U(I-2,3)))/DETER + 30 CONTINUE + FPS(N-1,1)=DETLT(N-2)*BPS(N-2)*(-B(N-1)*U(N-1,1)+ & + B(N-2)*U(N-2,1))/DETER- & + DETLT(N-3)*APS(N-1)*BPS(N-3)*B(N-3)*U(N-3,1)/DETER + FPS(N-1,2)=DETLT(N-2)*BPS(N-2)*(-B(N-1)*U(N-1,2)+ & + B(N-2)*U(N-2,2))/DETER- & + DETLT(N-3)*APS(N-1)*BPS(N-3)*B(N-3)*U(N-3,2)/DETER + FPS(N-1,3)=DETLT(N-2)*BPS(N-2)*(-B(N-1)*U(N-1,3)+ & + B(N-2)*U(N-2,3))/DETER- & + DETLT(N-3)*APS(N-1)*BPS(N-3)*B(N-3)*U(N-3,3)/DETER + FPS(N,1)=-DETLT(N-2)*BPS(N-2)*B(N-2)*U(N-2,1)/DETER + FPS(N,2)=-DETLT(N-2)*BPS(N-2)*B(N-2)*U(N-2,2)/DETER + FPS(N,3)=-DETLT(N-2)*BPS(N-2)*B(N-2)*U(N-2,3)/DETER + + DO 35 I=1,N + DRDT(I+IB,1,RK)=DRDT(I+IB,1,RK)+FPS(I,1)/XI + DRDT(I+IB,2,RK)=DRDT(I+IB,2,RK)+FPS(I,2)/XI + DRDT(I+IB,3,RK)=DRDT(I+IB,3,RK)+FPS(I,3)/XI + 35 CONTINUE + endif + + +! Setup the B component + + DO 40 I=1,(N-1) + BLAM(I)=B(I)*XI*(U(I,1)*(DRDT(I+1+IB,1,RK)-DRDT(I+IB,1,RK))+ & + U(I,2)*(DRDT(I+1+IB,2,RK)-DRDT(I+IB,2,RK))+ & + U(I,3)*(DRDT(I+1+IB,3,RK)-DRDT(I+IB,3,RK)))+ & + XI*C*(B(I)**.2-L0**2.) + 40 CONTINUE + +! Calculate the new rates of change + + call DGTSV((N-1),1,ASUB,ADIAG,ASUPER,BLAM,(N-1),INFO) + + DRDT(1+IB,1,RK)=DRDT(1+IB,1,RK)+BLAM(1)*B(1)*U(1,1)/XI + DRDT(1+IB,2,RK)=DRDT(1+IB,2,RK)+BLAM(1)*B(1)*U(1,2)/XI + DRDT(1+IB,3,RK)=DRDT(1+IB,3,RK)+BLAM(1)*B(1)*U(1,3)/XI + DO 50 I=2,(N-1) + DRDT(I+IB,1,RK)=DRDT(I+IB,1,RK)+(BLAM(I)*B(I)*U(I,1)- & + BLAM(I-1)*B(I-1)*U(I-1,1))/XI + DRDT(I+IB,2,RK)=DRDT(I+IB,2,RK)+(BLAM(I)*B(I)*U(I,2)- & + BLAM(I-1)*B(I-1)*U(I-1,2))/XI + DRDT(I+IB,3,RK)=DRDT(I+IB,3,RK)+(BLAM(I)*B(I)*U(I,3)- & + BLAM(I-1)*B(I-1)*U(I-1,3))/XI + 50 CONTINUE + DRDT(N+IB,1,RK)=DRDT(N+IB,1,RK)-BLAM(N-1)*B(N-1)*U(N-1,1)/XI + DRDT(N+IB,2,RK)=DRDT(N+IB,2,RK)-BLAM(N-1)*B(N-1)*U(N-1,2)/XI + DRDT(N+IB,3,RK)=DRDT(N+IB,3,RK)-BLAM(N-1)*B(N-1)*U(N-1,3)/XI + + 5 CONTINUE + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/BDcode/force_elas.f90 b/BasicWLC/BDcode/force_elas.f90 new file mode 100644 index 00000000..1e9cbcd9 --- /dev/null +++ b/BasicWLC/BDcode/force_elas.f90 @@ -0,0 +1,171 @@ +!---------------------------------------------------------------* + +! +! This subroutine calculates the elastic forces for a wormlike +! chain with a stretching potential. The stretch and bend +! moduli are fed along with the bead positions. +! +! Andrew Spakowitz +! Written 9-1-04 + + SUBROUTINE force_elas(FELAS,TELAS,R,U,NT,N,NP, & + EB,EPAR,EPERP,GAM,ETA,SIMTYPE) + + DOUBLE PRECISION FELAS(NT,3) ! Elastic force + DOUBLE PRECISION TELAS(NT,3) ! Elastic force + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION B(NT) ! Bond lengths + INTEGER I,J,IB ! Index holders + INTEGER N,NT,NP ! Number of bead + INTEGER SIMTYPE ! Simulation method (WLC=1,SSWLC=2,GC=3) + +! Polymer properties + + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + +! Variables for force and torque calculations + + DOUBLE PRECISION DR(3),DRPAR,DRPERP(3) + DOUBLE PRECISION FI(3),TI1(3),TI2(3) + DOUBLE PRECISION U1U2,GI(3),HI(3) + + IB=1 + DO 10 I=1,NP + DO 20 J=1,N + FELAS(IB,1)=0. + FELAS(IB,2)=0. + FELAS(IB,3)=0. + TELAS(IB,1)=0. + TELAS(IB,2)=0. + TELAS(IB,3)=0. + if (SIMTYPE.EQ.1.AND.J.LE.(N-1)) then + U(IB,1)=R(IB+1,1)-R(IB,1) + U(IB,2)=R(IB+1,2)-R(IB,2) + U(IB,3)=R(IB+1,3)-R(IB,3) + B(IB)=sqrt(U(IB,1)**2.+U(IB,2)**2.+U(IB,3)**2.) + U(IB,1)=U(IB,1)/B(IB) + U(IB,2)=U(IB,2)/B(IB) + U(IB,3)=U(IB,3)/B(IB) + endif + IB=IB+1 + + 20 CONTINUE + 10 CONTINUE + +! Calculate the forces and torques + + DO 30 I=1,NP + DO 40 J=1,(N-1) + IB=J+N*(I-1) + if (SIMTYPE.EQ.1) then + + if (J.LE.(N-2)) then + + U1U2=U(IB,1)*U(IB+1,1)+U(IB,2)*U(IB+1,2)+U(IB,3)*U(IB+1,3) + + GI(1)=EB*(U(IB+1,1)-U1U2*U(IB,1))/B(IB) + GI(2)=EB*(U(IB+1,2)-U1U2*U(IB,2))/B(IB) + GI(3)=EB*(U(IB+1,3)-U1U2*U(IB,3))/B(IB) + + FELAS(IB,1)=FELAS(IB,1)-GI(1) + FELAS(IB,2)=FELAS(IB,2)-GI(2) + FELAS(IB,3)=FELAS(IB,3)-GI(3) + FELAS(IB+1,1)=FELAS(IB+1,1)+GI(1) + FELAS(IB+1,2)=FELAS(IB+1,2)+GI(2) + FELAS(IB+1,3)=FELAS(IB+1,3)+GI(3) + + GI(1)=EB*(U(IB,1)-U1U2*U(IB+1,1))/B(IB+1) + GI(2)=EB*(U(IB,2)-U1U2*U(IB+1,2))/B(IB+1) + GI(3)=EB*(U(IB,3)-U1U2*U(IB+1,3))/B(IB+1) + + FELAS(IB+1,1)=FELAS(IB+1,1)-GI(1) + FELAS(IB+1,2)=FELAS(IB+1,2)-GI(2) + FELAS(IB+1,3)=FELAS(IB+1,3)-GI(3) + FELAS(IB+2,1)=FELAS(IB+2,1)+GI(1) + FELAS(IB+2,2)=FELAS(IB+2,2)+GI(2) + FELAS(IB+2,3)=FELAS(IB+2,3)+GI(3) + + endif + TELAS(IB,1)=0. + TELAS(IB,2)=0. + TELAS(IB,3)=0. + TELAS(IB+1,1)=0. + TELAS(IB+1,2)=0. + TELAS(IB+1,3)=0. + + elseif (SIMTYPE.EQ.2) then + DR(1)=R(IB+1,1)-R(IB,1) + DR(2)=R(IB+1,2)-R(IB,2) + DR(3)=R(IB+1,3)-R(IB,3) + DRPAR=DR(1)*U(IB,1)+DR(2)*U(IB,2)+DR(3)*U(IB,3) + + DRPERP(1)=DR(1)-DRPAR*U(IB,1) + DRPERP(2)=DR(2)-DRPAR*U(IB,2) + DRPERP(3)=DR(3)-DRPAR*U(IB,3) + U1U2=U(IB,1)*U(IB+1,1)+U(IB,2)*U(IB+1,2)+U(IB,3)*U(IB+1,3) + + GI(1)=U(IB+1,1)-U1U2*U(IB,1)-ETA*DRPERP(1) + GI(2)=U(IB+1,2)-U1U2*U(IB,2)-ETA*DRPERP(2) + GI(3)=U(IB+1,3)-U1U2*U(IB,3)-ETA*DRPERP(3) + + FI(1)=-ETA*EB*GI(1)+EPAR*(DRPAR-GAM)*U(IB,1)+EPERP*DRPERP(1) + FI(2)=-ETA*EB*GI(2)+EPAR*(DRPAR-GAM)*U(IB,2)+EPERP*DRPERP(2) + FI(3)=-ETA*EB*GI(3)+EPAR*(DRPAR-GAM)*U(IB,3)+EPERP*DRPERP(3) + + FELAS(IB,1)=FELAS(IB,1)+FI(1) + FELAS(IB,2)=FELAS(IB,2)+FI(2) + FELAS(IB,3)=FELAS(IB,3)+FI(3) + FELAS(IB+1,1)=FELAS(IB+1,1)-FI(1) + FELAS(IB+1,2)=FELAS(IB+1,2)-FI(2) + FELAS(IB+1,3)=FELAS(IB+1,3)-FI(3) + + GI(1)=U(IB+1,1)-U(IB,1)-ETA*DRPERP(1) + GI(2)=U(IB+1,2)-U(IB,2)-ETA*DRPERP(2) + GI(3)=U(IB+1,3)-U(IB,3)-ETA*DRPERP(3) + + TI1(1)=EB*GI(1) + TI1(2)=EB*GI(2) + TI1(3)=EB*GI(3) + + TI2(1)=-ETA*EB*DRPAR*GI(1)+ETA*EB*(1-U1U2)*DR(1)-EPAR*(DRPAR-GAM)*DR(1)+EPERP*DRPAR*DRPERP(1) + TI2(2)=-ETA*EB*DRPAR*GI(2)+ETA*EB*(1-U1U2)*DR(2)-EPAR*(DRPAR-GAM)*DR(2)+EPERP*DRPAR*DRPERP(2) + TI2(3)=-ETA*EB*DRPAR*GI(3)+ETA*EB*(1-U1U2)*DR(3)-EPAR*(DRPAR-GAM)*DR(3)+EPERP*DRPAR*DRPERP(3) + + TELAS(IB,1)=TELAS(IB,1)+TI1(1)+TI2(1) + TELAS(IB,2)=TELAS(IB,2)+TI1(2)+TI2(2) + TELAS(IB,3)=TELAS(IB,3)+TI1(3)+TI2(3) + TELAS(IB+1,1)=TELAS(IB+1,1)-TI1(1) + TELAS(IB+1,2)=TELAS(IB+1,2)-TI1(2) + TELAS(IB+1,3)=TELAS(IB+1,3)-TI1(3) + + elseif (SIMTYPE.EQ.3) then + + DR(1)=R(IB+1,1)-R(IB,1) + DR(2)=R(IB+1,2)-R(IB,2) + DR(3)=R(IB+1,3)-R(IB,3) + + FELAS(IB,1)=FELAS(IB,1)+EPAR*DR(1) + FELAS(IB,2)=FELAS(IB,2)+EPAR*DR(2) + FELAS(IB,3)=FELAS(IB,3)+EPAR*DR(3) + FELAS(IB+1,1)=FELAS(IB+1,1)-EPAR*DR(1) + FELAS(IB+1,2)=FELAS(IB+1,2)-EPAR*DR(2) + FELAS(IB+1,3)=FELAS(IB+1,3)-EPAR*DR(3) + + TELAS(IB,1)=0. + TELAS(IB,2)=0. + TELAS(IB,3)=0. + TELAS(IB+1,1)=0. + TELAS(IB+1,2)=0. + TELAS(IB+1,3)=0. + + endif + + 40 CONTINUE + 30 CONTINUE + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/BDcode/force_ponp.f90 b/BasicWLC/BDcode/force_ponp.f90 new file mode 100644 index 00000000..9ca2379b --- /dev/null +++ b/BasicWLC/BDcode/force_ponp.f90 @@ -0,0 +1,162 @@ +!---------------------------------------------------------------* + +! +! This subroutine calculates the self-interaction polymer +! using the closest-point interpolation strategy +! +! Andrew Spakowitz +! Written 11-12-13 + + SUBROUTINE force_ponp(FPONP,R,NT,N,NP,LHC,VHC,LBOX,GAM,DT,XIR,SWDT) + + DOUBLE PRECISION R(NT,3) ! Bead positions + INTEGER N,NT,NP ! Current number of beads + DOUBLE PRECISION FPONP(NT,3) ! Self-interaction force + DOUBLE PRECISION FMAG ! Mag of force + DOUBLE PRECISION RIJ ! Interbead dist + DOUBLE PRECISION EIJ(3) ! Interbead unit vector + INTEGER I, J ! Index holders + INTEGER SKIP ! Bead skip index + +! Variables for the calculation + + DOUBLE PRECISION U1(3),U2(3),U1U2 + DOUBLE PRECISION D1,D2 + DOUBLE PRECISION R12(3),D12,E12(3) + DOUBLE PRECISION S1,S2 + DOUBLE PRECISION GI(3) + INTEGER I1,J1,I2,J2 + INTEGER IB1,IB2 + +! Parameters in the simulation + + DOUBLE PRECISION LHC ! HC length + DOUBLE PRECISION SIGP ! HC diameter + DOUBLE PRECISION VHC ! Potential strengths + DOUBLE PRECISION GAM + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION SUM + DOUBLE PRECISION DT + DOUBLE PRECISION XIR + +! Variables for the timestep switch + + INTEGER SWDT + +! Setup the parameters + + IB1=1 + DO 10 I1=1,NP + DO 20 J1=1,N + FPONP(IB1,1)=0. + FPONP(IB1,2)=0. + FPONP(IB1,3)=0. + IB1=IB1+1 + 20 CONTINUE + 10 CONTINUE + +! Calculate the self-interaction forces + + DO 30 I1=1,(NP-1) + DO 40 J1=1,(N-1) + IB1=J1+N*(I1-1) + DO 50 I2=(I1+1),NP + DO 60 J2=1,(N-1) + IB2=J2+N*(I2-1) + R12(1)=R(IB2,1)-R(IB1,1) + R12(2)=R(IB2,2)-R(IB1,2) + R12(3)=R(IB2,3)-R(IB1,3) + R12(1)=R12(1)-nint(R12(1)/LBOX)*LBOX + R12(2)=R12(2)-nint(R12(2)/LBOX)*LBOX + R12(3)=R12(3)-nint(R12(3)/LBOX)*LBOX + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + if (D12.GT.(3.*GAM)) then + goto 70 + endif + + U1(1)=R(IB1+1,1)-R(IB1,1) + U1(2)=R(IB1+1,2)-R(IB1,2) + U1(3)=R(IB1+1,3)-R(IB1,3) + D1=sqrt(U1(1)**2.+U1(2)**2.+U1(3)**2.) + U1(1)=U1(1)/D1 + U1(2)=U1(2)/D1 + U1(3)=U1(3)/D1 + + U2(1)=R(IB2+1,1)-R(IB2,1) + U2(2)=R(IB2+1,2)-R(IB2,2) + U2(3)=R(IB2+1,3)-R(IB2,3) + D2=sqrt(U2(1)**2.+U2(2)**2.+U2(3)**2.) + U2(1)=U2(1)/D2 + U2(2)=U2(2)/D2 + U2(3)=U2(3)/D2 + + U1U2=U1(1)*U2(1)+U1(2)*U2(2)+U1(3)*U2(3) + if (U1U2.EQ.1.) then + goto 70 + endif + + GI(1)=U1(1)-U1U2*U2(1) + GI(2)=U1(2)-U1U2*U2(2) + GI(3)=U1(3)-U1U2*U2(3) + + S1=(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S1.GT.D1.OR.S1.LT.0.) then + goto 70 + endif + + GI(1)=U2(1)-U1U2*U1(1) + GI(2)=U2(2)-U1U2*U1(2) + GI(3)=U2(3)-U1U2*U1(3) + + S2=-(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S2.GT.D2.OR.S2.LT.0.) then + goto 70 + endif + + R12(1)=R12(1)+S2*U2(1)-S1*U1(1) + R12(2)=R12(2)+S2*U2(2)-S1*U1(2) + R12(3)=R12(3)+S2*U2(3)-S1*U1(3) + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + + if (D12.GT.LHC) then + goto 70 + endif + + E12(1)=R12(1)/D12 + E12(2)=R12(2)/D12 + E12(3)=R12(3)/D12 + FMAG=VHC*((LHC/D12)**13.-(LHC/D12)**7.)/LHC + + if ((FMAG/XIR).GT.(0.001/DT)) then + DT=XIR*0.0005/FMAG + SWDT=1 + endif + + FPONP(IB1,1)=FPONP(IB1,1)+FMAG*E12(1)*(-1.+S1/D1) + FPONP(IB1,2)=FPONP(IB1,2)+FMAG*E12(2)*(-1.+S1/D1) + FPONP(IB1,3)=FPONP(IB1,3)+FMAG*E12(3)*(-1.+S1/D1) + FPONP(IB1+1,1)=FPONP(IB1+1,1)+FMAG*E12(1)*(-S1/D1) + FPONP(IB1+1,2)=FPONP(IB1+1,2)+FMAG*E12(2)*(-S1/D1) + FPONP(IB1+1,3)=FPONP(IB1+1,3)+FMAG*E12(3)*(-S1/D1) + FPONP(IB2,1)=FPONP(IB2,1)+FMAG*E12(1)*(1.-S2/D2) + FPONP(IB2,2)=FPONP(IB2,2)+FMAG*E12(2)*(1.-S2/D2) + FPONP(IB2,3)=FPONP(IB2,3)+FMAG*E12(3)*(1.-S2/D2) + FPONP(IB2+1,1)=FPONP(IB2+1,1)+FMAG*E12(1)*(S2/D2) + FPONP(IB2+1,2)=FPONP(IB2+1,2)+FMAG*E12(2)*(S2/D2) + FPONP(IB2+1,3)=FPONP(IB2+1,3)+FMAG*E12(3)*(S2/D2) + + 70 CONTINUE + 60 CONTINUE + 50 CONTINUE + 40 CONTINUE + 30 CONTINUE + + RETURN + END + +!---------------------------------------------------------------* + diff --git a/BasicWLC/BDcode/methyl_profile.f90 b/BasicWLC/BDcode/methyl_profile.f90 new file mode 100644 index 00000000..a18759ee --- /dev/null +++ b/BasicWLC/BDcode/methyl_profile.f90 @@ -0,0 +1,63 @@ +subroutine methyl_profile(nt,meth_status,ktot,km,kd,num_methylated,time,rxn_happen,pairs,dt,dt_mod,nuc_site,num_spread,num_decay) + use mt19937, only : grnd + implicit none + integer, intent(in) :: nt, pairs(2,nt), nuc_site + integer, intent(inout) :: meth_status(nt), rxn_happen, num_spread, num_methylated, num_decay + double precision, intent(in) :: km, kd, ktot, dt, time + double precision, intent(inout) :: dt_mod + double precision :: time_rxn, rn1, rn2, rn3, prob_no_rxn, prob_demeth, prob_meth + integer :: site_rxn, count, i + + ! for pairs of beads that could transfer a methyl mark, + ! perform Gillespie algorithm to determine if reaction happens and then update methyl profile + + if (rxn_happen.eq.1) then + ! does a reaction occur? + rn1 = grnd() + prob_no_rxn = exp(-ktot*dt_mod) + if (rn1.gt.prob_no_rxn) then + ! which reaction occurred? + rn2 = grnd() + prob_demeth = (kd/ktot)*(num_methylated-1) + if (rn2.lt.prob_demeth) then ! one site is demethylated + site_rxn = ceiling(rn2/(kd/ktot)) + count = 0 + i = 1 + do while ((count.lt.site_rxn).and.(i.lt.nuc_site)) + count = count + meth_status(i) + i = i+1 + end do + if ((count.eq.site_rxn).and.((i-1).lt.nuc_site)) then + meth_status(i-1) = 0 + num_decay = num_decay + 1 + elseif ((count.lt.site_rxn).and.(i.eq.nuc_site)) then + i = i+1 + do while (count.lt.site_rxn) + count = count + meth_status(i) + i = i+1 + end do + meth_status(i-1) = 0 + num_decay = num_decay + 1 + end if + else ! one site is methylated + prob_meth = rn2 - prob_demeth + site_rxn = ceiling(prob_meth/(km/ktot)) + meth_status(pairs(2,site_rxn)) = 1 + num_spread = num_spread + 1 + end if + ! at what time did it occur? + rn3 = grnd() + time_rxn = time - (1/ktot)*log(rn2*(prob_no_rxn-1)+1) + dt_mod = time + dt - time_rxn + else + rxn_happen = 0 + end if + end if + + num_methylated = sum(meth_status) + +end + + + + diff --git a/BasicWLC/BDcode/tot_rate_constant.f90 b/BasicWLC/BDcode/tot_rate_constant.f90 new file mode 100644 index 00000000..9a1fb597 --- /dev/null +++ b/BasicWLC/BDcode/tot_rate_constant.f90 @@ -0,0 +1,15 @@ +subroutine tot_rate_constant(nt,could_react,meth_status,km,kd,ktot,num_methylated) + implicit none + integer, intent(in) :: nt, could_react, meth_status(nt) + double precision, intent(in) :: km, kd + double precision, intent(inout) :: ktot + integer, intent(inout) :: num_methylated + + ! determine total rate constant for all possible reactions + ktot = (num_methylated-1)*kd + could_react*km +end + + + + + diff --git a/BasicWLC/DATAcode/MINV.f90 b/BasicWLC/DATAcode/MINV.f90 new file mode 100644 index 00000000..f281242a --- /dev/null +++ b/BasicWLC/DATAcode/MINV.f90 @@ -0,0 +1,49 @@ +!---------------------------------------------------------------* + +! +! This subroutine finds the inverse of a 3x3 matrix and finds +! its determinant +! +! Andrew Spakowitz +! Written 9-1-04 + + SUBROUTINE MINV(A,B,DET) + + DOUBLE PRECISION A(3,3) ! Original matrix + DOUBLE PRECISION B(3,3) ! Inverse matrix + DOUBLE PRECISION DET ! Determinant + DOUBLE PRECISION COA(3,3) ! Cofactor of A + + +! First find the determinant + + DET = A(1,1)*(A(2,2)*A(3,3)-A(2,3)*A(3,2))+A(1,2)*(A(2,3)*A(3,1)-A(2,1)*A(3,3))+A(1,3)*(A(2,1)*A(3,2)-A(2,2)*A(3,1)) + +! Find the Cofactor of A + + COA(1,1) = A(2,2)*A(3,3)-A(2,3)*A(3,2) + COA(1,2) = -(A(2,1)*A(3,3)-A(2,3)*A(3,1)) + COA(1,3) = A(2,1)*A(3,2)-A(2,2)*A(3,1) + COA(2,1) = -(A(1,2)*A(3,3)-A(1,3)*A(3,2)) + COA(2,2) = A(1,1)*A(3,3)-A(1,3)*A(3,1) + COA(2,3) = -(A(1,1)*A(3,2)-A(1,2)*A(3,1)) + COA(3,1) = A(1,2)*A(2,3)-A(1,3)*A(2,2) + COA(3,2) = -(A(1,1)*A(2,3)-A(1,3)*A(2,1)) + COA(3,3) = A(1,1)*A(2,2)-A(1,2)*A(2,1) + +! Find the inverse of A + + B(1,1) = COA(1,1)/DET + B(1,2) = COA(2,1)/DET + B(1,3) = COA(3,1)/DET + B(2,1) = COA(1,2)/DET + B(2,2) = COA(2,2)/DET + B(2,3) = COA(3,2)/DET + B(3,1) = COA(1,3)/DET + B(3,2) = COA(2,3)/DET + B(3,3) = COA(3,3)/DET + + RETURN + END + +!---------------------------------------------------------------* \ No newline at end of file diff --git a/BasicWLC/DATAcode/find_struc.f90 b/BasicWLC/DATAcode/find_struc.f90 new file mode 100644 index 00000000..1ac992e9 --- /dev/null +++ b/BasicWLC/DATAcode/find_struc.f90 @@ -0,0 +1,118 @@ +!---------------------------------------------------------------* + +! +! This subroutine analyses the structure of the expanding +! filament. +! +! Andrew Spakowitz +! Written 9-1-04 + +! Check the calculator of eigenvalue/eigenvector + + SUBROUTINE find_struc(R,NT,N,RCOM,DELR) + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(N-1,3) ! Tangent + DOUBLE PRECISION B(N-1) ! Bond length + INTEGER N,NT ! Number of beads + INTEGER I + +! Structure analysis + + DOUBLE PRECISION RCOM(3) ! Center of mass + DOUBLE PRECISION DELR(3) ! Mag of gyration tensor + DOUBLE PRECISION TEMP(3) + DOUBLE PRECISION DELRR(3) ! Real part + DOUBLE PRECISION DELRI(3) ! Imaginary part + DOUBLE PRECISION EVEC(3,3) + DOUBLE PRECISION T(3,3) ! Radius of gyration tensor + double precision fv1(3) + integer iv1(3) + INTEGER ERR + +! Find the center of mass + + RCOM(1)=0. + RCOM(2)=0. + RCOM(3)=0. + DO 10 I=1,N + RCOM(1)=RCOM(1)+R(I,1) + RCOM(2)=RCOM(2)+R(I,2) + RCOM(3)=RCOM(3)+R(I,3) + 10 CONTINUE + RCOM(1)=RCOM(1)/N + RCOM(2)=RCOM(2)/N + RCOM(3)=RCOM(3)/N + +! Find the principle radii of gyration + + T(1,1)=0. + T(1,2)=0. + T(1,3)=0. + T(2,1)=0. + T(2,2)=0. + T(2,3)=0. + T(3,1)=0. + T(3,2)=0. + T(3,3)=0. + DO 20 I=1,N + T(1,1)=T(1,1)+(R(I,1)-RCOM(1))*(R(I,1)-RCOM(1)) + T(1,2)=T(1,2)+(R(I,1)-RCOM(1))*(R(I,2)-RCOM(2)) + T(1,3)=T(1,3)+(R(I,1)-RCOM(1))*(R(I,3)-RCOM(3)) + T(2,1)=T(2,1)+(R(I,2)-RCOM(2))*(R(I,1)-RCOM(1)) + T(2,2)=T(2,2)+(R(I,2)-RCOM(2))*(R(I,2)-RCOM(2)) + T(2,3)=T(2,3)+(R(I,2)-RCOM(2))*(R(I,3)-RCOM(3)) + T(3,1)=T(3,1)+(R(I,3)-RCOM(3))*(R(I,1)-RCOM(1)) + T(3,2)=T(3,2)+(R(I,3)-RCOM(3))*(R(I,2)-RCOM(2)) + T(3,3)=T(3,3)+(R(I,3)-RCOM(3))*(R(I,3)-RCOM(3)) + 20 CONTINUE + T(1,1)=T(1,1)/N + T(1,2)=T(1,2)/N + T(1,3)=T(1,3)/N + T(2,1)=T(2,1)/N + T(2,2)=T(2,2)/N + T(2,3)=T(2,3)/N + T(3,1)=T(3,1)/N + T(3,2)=T(3,2)/N + T(3,3)=T(3,3)/N + +! call rg(3,3,T,DELRR,DELRI,1,EVEC,iv1,fv1,ERR) + + DELR(1)=sqrt(DELRR(1)) + DELR(2)=sqrt(DELRR(2)) + DELR(3)=sqrt(DELRR(3)) + + if (DELR(1).GT.DELR(2).AND.DELR(2).GT.DELR(3)) then + TEMP(1)=DELR(1) + TEMP(2)=DELR(2) + TEMP(3)=DELR(3) + elseif (DELR(2).GT.DELR(1).AND.DELR(1).GT.DELR(3)) then + TEMP(1)=DELR(2) + TEMP(2)=DELR(1) + TEMP(3)=DELR(3) + elseif (DELR(1).GT.DELR(3).AND.DELR(3).GT.DELR(2)) then + TEMP(1)=DELR(1) + TEMP(2)=DELR(3) + TEMP(3)=DELR(2) + elseif (DELR(2).GT.DELR(3).AND.DELR(3).GT.DELR(1)) then + TEMP(1)=DELR(2) + TEMP(2)=DELR(3) + TEMP(3)=DELR(1) + elseif (DELR(3).GT.DELR(1).AND.DELR(1).GT.DELR(2)) then + TEMP(1)=DELR(3) + TEMP(2)=DELR(1) + TEMP(3)=DELR(2) + elseif (DELR(3).GT.DELR(2).AND.DELR(2).GT.DELR(1)) then + TEMP(1)=DELR(3) + TEMP(2)=DELR(2) + TEMP(3)=DELR(1) + endif + + DELR(1)=TEMP(1) + DELR(2)=TEMP(2) + DELR(3)=TEMP(3) + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/MCcode/MC_capsid_ex.f90 b/BasicWLC/MCcode/MC_capsid_ex.f90 new file mode 100644 index 00000000..d7c26983 --- /dev/null +++ b/BasicWLC/MCcode/MC_capsid_ex.f90 @@ -0,0 +1,38 @@ +!---------------------------------------------------------------* + +! +! This subroutine calculates the change in the energy due to +! interaction with a spherical capsid. +! +! Corrections to force magnitude made 6-3-04. +! +! Andrew Spakowitz +! Written 6-29-04 + + SUBROUTINE MC_ex(DEEX,R,NT,N,DR,I,RAD,VCAP) + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION DR(3) ! Change in bead position + DOUBLE PRECISION RMAG,RMAGD ! Dist from origin + INTEGER I ! Current test index + DOUBLE PRECISION RAD ! Radius of capsid + DOUBLE PRECISION VCAP ! Capsid interaction + INTEGER N,NT ! Number of beads + DOUBLE PRECISION DEEX ! Change in external energy + +! Calculate the change in energy + + RMAG=sqrt(R(I,1)**2+R(I,2)**2+R(I,3)**2) + RMAGD=sqrt((R(I,1)+DR(1))**2+(R(I,2)+DR(2))**2+(R(I,3)+DR(3))**2) + if (RMAG.GT.RAD.AND.RMAGD.GT.RAD) then + DEEX=VCAP*((RMAGD-RAD)**4.-(RMAG-RAD)**4.) + elseif (RMAG.GT.RAD.AND.RMAGD.LE.RAD) then + DEEX=-VCAP*((RMAG-RAD)**4.) + elseif (RMAG.LE.RAD.AND.RMAGD.GT.RAD) then + DEEX=VCAP*((RMAGD-RAD)**4.) + endif + + RETURN + END + +!---------------------------------------------------------------* \ No newline at end of file diff --git a/BasicWLC/MCcode/MC_elas.f90 b/BasicWLC/MCcode/MC_elas.f90 new file mode 100644 index 00000000..a0097e3a --- /dev/null +++ b/BasicWLC/MCcode/MC_elas.f90 @@ -0,0 +1,214 @@ +!---------------------------------------------------------------* + +! subroutine MC_eelas +! +! Calculate the change in the polymer elastic energy +! due to the displacement from a MC move + + SUBROUTINE MC_eelas(DEELAS,R,U,RP,UP,NT,N,NP,IP, & + IB1,IB2,IT1,IT2,EB,EPAR,EPERP,GAM,ETA,SIMTYPE) + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION RP(NT,3) ! Bead positions + DOUBLE PRECISION UP(NT,3) ! Tangent vectors + INTEGER N,NP,NT ! Number of beads + + INTEGER IP ! Test polymer + INTEGER IB1 ! Test bead position 1 + INTEGER IT1 ! Index of test bead 1 + INTEGER IB2 ! Test bead position 2 + INTEGER IT2 ! Index of test bead 2 + + DOUBLE PRECISION DEELAS ! Change in ECOM + +! Polymer properties + + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + INTEGER SIMTYPE ! Simulation method (WLC=1,SSWLC=2,GC=3) + +! Variables for force and torque calculations + + DOUBLE PRECISION DR(3),DRPAR,DRPERP(3),DRPERPM(3) + DOUBLE PRECISION FI(3),TI(3) + DOUBLE PRECISION U1U2,GI(3),DOTGU,HI(3) + DOUBLE PRECISION UNORM + +! Setup parameters + + DEELAS=0. + +! Calculate the change in the energy + + if (IB1.NE.1) then + + if (SIMTYPE.EQ.1.AND.IB1.NE.N) then + + U(IT1-1,1)=R(IT1,1)-R(IT1-1,1) + U(IT1-1,2)=R(IT1,2)-R(IT1-1,2) + U(IT1-1,3)=R(IT1,3)-R(IT1-1,3) + UNORM=sqrt(U(IT1-1,1)**2.+U(IT1-1,2)**2.+U(IT1-1,3)**2.) + U(IT1-1,1)=U(IT1-1,1)/UNORM + U(IT1-1,2)=U(IT1-1,2)/UNORM + U(IT1-1,3)=U(IT1-1,3)/UNORM + + U(IT1,1)=R(IT1+1,1)-R(IT1,1) + U(IT1,2)=R(IT1+1,2)-R(IT1,2) + U(IT1,3)=R(IT1+1,3)-R(IT1,3) + UNORM=sqrt(U(IT1,1)**2.+U(IT1,2)**2.+U(IT1,3)**2.) + U(IT1,1)=U(IT1,1)/UNORM + U(IT1,2)=U(IT1,2)/UNORM + U(IT1,3)=U(IT1,3)/UNORM + + UP(IT1,1)=RP(IT1+1,1)-RP(IT1,1) + UP(IT1,2)=RP(IT1+1,2)-RP(IT1,2) + UP(IT1,3)=RP(IT1+1,3)-RP(IT1,3) + UNORM=sqrt(UP(IT1,1)**2.+UP(IT1,2)**2.+UP(IT1,3)**2.) + UP(IT1,1)=UP(IT1,1)/UNORM + UP(IT1,2)=UP(IT1,2)/UNORM + UP(IT1,3)=UP(IT1,3)/UNORM + + U1U2=U(IT1-1,1)*U(IT1,1)+U(IT1-1,2)*U(IT1,2)+U(IT1-1,3)*U(IT1,3) + DEELAS=DEELAS+EB*U1U2 + U1U2=U(IT1-1,1)*UP(IT1,1)+U(IT1-1,2)*UP(IT1,2)+U(IT1-1,3)*UP(IT1,3) + DEELAS=DEELAS-EB*U1U2 + + elseif (SIMTYPE.EQ.2) then + + DR(1)=R(IT1,1)-R(IT1-1,1) + DR(2)=R(IT1,2)-R(IT1-1,2) + DR(3)=R(IT1,3)-R(IT1-1,3) + DRPAR=DR(1)*U(IT1-1,1)+DR(2)*U(IT1-1,2)+DR(3)*U(IT1-1,3) + + DRPERP(1)=DR(1)-DRPAR*U(IT1-1,1) + DRPERP(2)=DR(2)-DRPAR*U(IT1-1,2) + DRPERP(3)=DR(3)-DRPAR*U(IT1-1,3) + U1U2=U(IT1-1,1)*U(IT1,1)+U(IT1-1,2)*U(IT1,2)+U(IT1-1,3)*U(IT1,3) + + GI(1)=(U(IT1,1)-U(IT1-1,1)-ETA*DRPERP(1)) + GI(2)=(U(IT1,2)-U(IT1-1,2)-ETA*DRPERP(2)) + GI(3)=(U(IT1,3)-U(IT1-1,3)-ETA*DRPERP(3)) + + DEELAS=DEELAS-0.5*EB*(GI(1)**2.+GI(2)**2.+GI(3)**2.) & + -0.5*EPAR*(DRPAR-GAM)**2.-0.5*EPERP*(DRPERP(1)**2.+DRPERP(2)**2.+DRPERP(3)**2.) + + DR(1)=RP(IT1,1)-R(IT1-1,1) + DR(2)=RP(IT1,2)-R(IT1-1,2) + DR(3)=RP(IT1,3)-R(IT1-1,3) + DRPAR=DR(1)*U(IT1-1,1)+DR(2)*U(IT1-1,2)+DR(3)*U(IT1-1,3) + + DRPERP(1)=DR(1)-DRPAR*U(IT1-1,1) + DRPERP(2)=DR(2)-DRPAR*U(IT1-1,2) + DRPERP(3)=DR(3)-DRPAR*U(IT1-1,3) + U1U2=U(IT1-1,1)*UP(IT1,1)+U(IT1-1,2)*UP(IT1,2)+U(IT1-1,3)*UP(IT1,3) + + GI(1)=(UP(IT1,1)-U(IT1-1,1)-ETA*DRPERP(1)) + GI(2)=(UP(IT1,2)-U(IT1-1,2)-ETA*DRPERP(2)) + GI(3)=(UP(IT1,3)-U(IT1-1,3)-ETA*DRPERP(3)) + + DEELAS=DEELAS+0.5*EB*(GI(1)**2.+GI(2)**2.+GI(3)**2.) & + +0.5*EPAR*(DRPAR-GAM)**2.+0.5*EPERP*(DRPERP(1)**2.+DRPERP(2)**2.+DRPERP(3)**2.) + + elseif (SIMTYPE.EQ.3) then + + DR(1)=R(IT1,1)-R(IT1-1,1) + DR(2)=R(IT1,2)-R(IT1-1,2) + DR(3)=R(IT1,3)-R(IT1-1,3) + DEELAS=DEELAS-0.5*EPAR*(DR(1)**2.+DR(2)**2.+DR(3)**2.) + DR(1)=RP(IT1,1)-R(IT1-1,1) + DR(2)=RP(IT1,2)-R(IT1-1,2) + DR(3)=RP(IT1,3)-R(IT1-1,3) + DEELAS=DEELAS+0.5*EPAR*(DR(1)**2.+DR(2)**2.+DR(3)**2.) + + endif + endif + + if (IB2.NE.N) then + + if (SIMTYPE.EQ.1.AND.IB2.NE.1) then + + U(IT2-1,1)=R(IT2,1)-R(IT2-1,1) + U(IT2-1,2)=R(IT2,2)-R(IT2-1,2) + U(IT2-1,3)=R(IT2,3)-R(IT2-1,3) + UNORM=sqrt(U(IT2-1,1)**2.+U(IT2-1,2)**2.+U(IT2-1,3)**2.) + U(IT2-1,1)=U(IT2-1,1)/UNORM + U(IT2-1,2)=U(IT2-1,2)/UNORM + U(IT2-1,3)=U(IT2-1,3)/UNORM + + U(IT2,1)=R(IT2+1,1)-R(IT2,1) + U(IT2,2)=R(IT2+1,2)-R(IT2,2) + U(IT2,3)=R(IT2+1,3)-R(IT2,3) + UNORM=sqrt(U(IT2,1)**2.+U(IT2,2)**2.+U(IT2,3)**2.) + U(IT2,1)=U(IT2,1)/UNORM + U(IT2,2)=U(IT2,2)/UNORM + U(IT2,3)=U(IT2,3)/UNORM + + UP(IT2-1,1)=RP(IT2,1)-RP(IT2-1,1) + UP(IT2-1,2)=RP(IT2,2)-RP(IT2-1,2) + UP(IT2-1,3)=RP(IT2,3)-RP(IT2-1,3) + UNORM=sqrt(UP(IT2-1,1)**2.+UP(IT2-1,2)**2.+UP(IT2-1,3)**2.) + UP(IT2-1,1)=UP(IT2-1,1)/UNORM + UP(IT2-1,2)=UP(IT2-1,2)/UNORM + UP(IT2-1,3)=UP(IT2-1,3)/UNORM + + U1U2=U(IT2-1,1)*U(IT2,1)+U(IT2-1,2)*U(IT2,2)+U(IT2-1,3)*U(IT2,3) + DEELAS=DEELAS+EB*U1U2 + U1U2=UP(IT2-1,1)*U(IT2,1)+UP(IT2-1,2)*U(IT2,2)+UP(IT2-1,3)*U(IT2,3) + DEELAS=DEELAS-EB*U1U2 + + elseif (SIMTYPE.EQ.2) then + + DR(1)=R(IT2+1,1)-R(IT2,1) + DR(2)=R(IT2+1,2)-R(IT2,2) + DR(3)=R(IT2+1,3)-R(IT2,3) + DRPAR=DR(1)*U(IT2,1)+DR(2)*U(IT2,2)+DR(3)*U(IT2,3) + + DRPERP(1)=DR(1)-DRPAR*U(IT2,1) + DRPERP(2)=DR(2)-DRPAR*U(IT2,2) + DRPERP(3)=DR(3)-DRPAR*U(IT2,3) + U1U2=U(IT2,1)*U(IT2+1,1)+U(IT2,2)*U(IT2+1,2)+U(IT2,3)*U(IT2+1,3) + + GI(1)=(U(IT2+1,1)-U(IT2,1)-ETA*DRPERP(1)) + GI(2)=(U(IT2+1,2)-U(IT2,2)-ETA*DRPERP(2)) + GI(3)=(U(IT2+1,3)-U(IT2,3)-ETA*DRPERP(3)) + + DEELAS=DEELAS-0.5*EB*(GI(1)**2.+GI(2)**2.+GI(3)**2.) & + -0.5*EPAR*(DRPAR-GAM)**2.-0.5*EPERP*(DRPERP(1)**2.+DRPERP(2)**2.+DRPERP(3)**2.) + + DR(1)=R(IT2+1,1)-RP(IT2,1) + DR(2)=R(IT2+1,2)-RP(IT2,2) + DR(3)=R(IT2+1,3)-RP(IT2,3) + DRPAR=DR(1)*UP(IT2,1)+DR(2)*UP(IT2,2)+DR(3)*UP(IT2,3) + + DRPERP(1)=DR(1)-DRPAR*UP(IT2,1) + DRPERP(2)=DR(2)-DRPAR*UP(IT2,2) + DRPERP(3)=DR(3)-DRPAR*UP(IT2,3) + U1U2=UP(IT2,1)*U(IT2+1,1)+UP(IT2,2)*U(IT2+1,2)+UP(IT2,3)*U(IT2+1,3) + + GI(1)=(U(IT2+1,1)-UP(IT2,1)-ETA*DRPERP(1)) + GI(2)=(U(IT2+1,2)-UP(IT2,2)-ETA*DRPERP(2)) + GI(3)=(U(IT2+1,3)-UP(IT2,3)-ETA*DRPERP(3)) + + DEELAS=DEELAS+0.5*EB*(GI(1)**2.+GI(2)**2.+GI(3)**2.) & + +0.5*EPAR*(DRPAR-GAM)**2.+0.5*EPERP*(DRPERP(1)**2.+DRPERP(2)**2.+DRPERP(3)**2.) + + elseif (SIMTYPE.EQ.3) then + + DR(1)=R(IT2+1,1)-R(IT2,1) + DR(2)=R(IT2+1,2)-R(IT2,2) + DR(3)=R(IT2+1,3)-R(IT2,3) + DEELAS=DEELAS-0.5*EPAR*(DR(1)**2.+DR(2)**2.+DR(3)**2.) + DR(1)=R(IT2+1,1)-RP(IT2,1) + DR(2)=R(IT2+1,2)-RP(IT2,2) + DR(3)=R(IT2+1,3)-RP(IT2,3) + DEELAS=DEELAS+0.5*EPAR*(DR(1)**2.+DR(2)**2.+DR(3)**2.) + + endif + + endif + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/MCcode/MC_move.f90 b/BasicWLC/MCcode/MC_move.f90 new file mode 100644 index 00000000..bb2369ef --- /dev/null +++ b/BasicWLC/MCcode/MC_move.f90 @@ -0,0 +1,326 @@ +!---------------------------------------------------------------* + +! subroutine MC_move +! +! Subroutine to perform conformational moves for MC simulation +! Move type include: +! 1. Crank-shaft move (internal segment) +! 2. Translational slide (internal segment) +! 3. End pivot move (end segment) +! 4. Tangent rotation (single tangent) +! 5. Whole chain rotation (whole chain) +! 6. Whole chain translation (whole chain) +! + + SUBROUTINE MC_move(R,U,RP,UP,NT,N,NP,IP,IB1,IB2, & + IT1,IT2,IDUM,MCTYPE,MCAMP) + + use mt19937, only : grnd + + PARAMETER (PI=3.141592654) ! Value of pi + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION RP(NT,3) ! Bead positions + DOUBLE PRECISION UP(NT,3) ! Tangent vectors + INTEGER N,NP,NT ! Number of beads + + INTEGER IP ! Test polymer + INTEGER IB1 ! Test bead position 1 + INTEGER IT1 ! Index of test bead 1 + INTEGER IB2 ! Test bead position 2 + INTEGER IT2 ! Index of test bead 2 + + INTEGER I,J ! Test indices + +! Variables for the crank-shaft move + + DOUBLE PRECISION TA(3) ! Axis of rotation + DOUBLE PRECISION P1(3) ! Point on rotation line + DOUBLE PRECISION MAG ! Magnitude of vector + DOUBLE PRECISION ROT(4,4) ! Rotation matrix + + INTEGER IDUM ! Seed for the generator + DOUBLE PRECISION ALPHA ! Angle of move + DOUBLE PRECISION BETA ! Angle of move + +! MC adaptation variables + + DOUBLE PRECISION MCAMP(6) ! Amplitude of random change + INTEGER MCTYPE ! Type of MC move + DOUBLE PRECISION DR(3) ! Displacement for slide move + INTEGER TEMP + +! Perform crank-shaft move (MCTYPE 1) + + if (MCTYPE.EQ.1) then + IP=nint(0.5+grnd()*NP) + IB1=nint(0.5+grnd()*N) + IB2=nint(0.5+grnd()*N) + if (IB2.LT.IB1) then + TEMP=IB1 + IB1=IB2 + IB2=TEMP + endif + IT1=N*(IP-1)+IB1 + IT2=N*(IP-1)+IB2 + + if (IB1.EQ.IB2.AND.IB1.EQ.1) then + TA(1)=R(IT1+1,1)-R(IT1,1) + TA(2)=R(IT1+1,2)-R(IT1,2) + TA(3)=R(IT1+1,3)-R(IT1,3) + elseif (IB1.EQ.IB2.AND.IB1.EQ.N) then + TA(1)=R(IT1,1)-R(IT1-1,1) + TA(2)=R(IT1,2)-R(IT1-1,2) + TA(3)=R(IT1,3)-R(IT1-1,3) + elseif (IB1.EQ.IB2.AND.IB1.NE.1.AND.IB2.NE.N) then + TA(1)=R(IT1+1,1)-R(IT1-1,1) + TA(2)=R(IT1+1,2)-R(IT1-1,2) + TA(3)=R(IT1+1,3)-R(IT1-1,3) + else + TA(1)=R(IT2,1)-R(IT1,1) + TA(2)=R(IT2,2)-R(IT1,2) + TA(3)=R(IT2,3)-R(IT1,3) + endif + MAG=sqrt(TA(1)**2.+TA(2)**2.+TA(3)**2.) + TA(1)=TA(1)/MAG + TA(2)=TA(2)/MAG + TA(3)=TA(3)/MAG + P1(1)=R(IT1,1) + P1(2)=R(IT1,2) + P1(3)=R(IT1,3) + + ALPHA=MCAMP(1)*(grnd()-0.5) + + ROT(1,1)=TA(1)**2.+(TA(2)**2.+TA(3)**2.)*cos(ALPHA) + ROT(1,2)=TA(1)*TA(2)*(1.-cos(ALPHA))-TA(3)*sin(ALPHA) + ROT(1,3)=TA(1)*TA(3)*(1.-cos(ALPHA))+TA(2)*sin(ALPHA) + ROT(1,4)=(P1(1)*(1.-TA(1)**2.) & + -TA(1)*(P1(2)*TA(2)+P1(3)*TA(3)))*(1.-cos(ALPHA))+(P1(2)*TA(3)-P1(3)*TA(2))*sin(ALPHA) + + ROT(2,1)=TA(1)*TA(2)*(1.-cos(ALPHA))+TA(3)*sin(ALPHA) + ROT(2,2)=TA(2)**2.+(TA(1)**2.+TA(3)**2.)*cos(ALPHA) + ROT(2,3)=TA(2)*TA(3)*(1.-cos(ALPHA))-TA(1)*sin(ALPHA) + ROT(2,4)=(P1(2)*(1.-TA(2)**2.) & + -TA(2)*(P1(1)*TA(1)+P1(3)*TA(3)))*(1.-cos(ALPHA))+(P1(3)*TA(1)-P1(1)*TA(3))*sin(ALPHA) + + ROT(3,1)=TA(1)*TA(3)*(1.-cos(ALPHA))-TA(2)*sin(ALPHA) + ROT(3,2)=TA(2)*TA(3)*(1.-cos(ALPHA))+TA(1)*sin(ALPHA) + ROT(3,3)=TA(3)**2.+(TA(1)**2.+TA(2)**2.)*cos(ALPHA) + ROT(3,4)=(P1(3)*(1.-TA(3)**2.) & + -TA(3)*(P1(1)*TA(1)+P1(2)*TA(2)))*(1.-cos(ALPHA))+(P1(1)*TA(2)-P1(2)*TA(1))*sin(ALPHA) + + DO 10 I=IT1,IT2 + RP(I,1)=ROT(1,4)+ROT(1,1)*R(I,1)+ROT(1,2)*R(I,2)+ROT(1,3)*R(I,3) + RP(I,2)=ROT(2,4)+ROT(2,1)*R(I,1)+ROT(2,2)*R(I,2)+ROT(2,3)*R(I,3) + RP(I,3)=ROT(3,4)+ROT(3,1)*R(I,1)+ROT(3,2)*R(I,2)+ROT(3,3)*R(I,3) + UP(I,1)=ROT(1,1)*U(I,1)+ROT(1,2)*U(I,2)+ROT(1,3)*U(I,3) + UP(I,2)=ROT(2,1)*U(I,1)+ROT(2,2)*U(I,2)+ROT(2,3)*U(I,3) + UP(I,3)=ROT(3,1)*U(I,1)+ROT(3,2)*U(I,2)+ROT(3,3)*U(I,3) + 10 CONTINUE + +! Perform slide move (MCTYPE 2) + + elseif (MCTYPE.EQ.2) then + + IP=nint(0.5+grnd()*NP) + IB1=nint(1.5+grnd()*(N-2.)) + IB2=nint(1.5+grnd()*(N-2.)) + if (IB2.LT.IB1) then + TEMP=IB1 + IB1=IB2 + IB2=TEMP + endif + IT1=N*(IP-1)+IB1 + IT2=N*(IP-1)+IB2 + + DR(1)=MCAMP(2)*(grnd()-0.5) + DR(2)=MCAMP(2)*(grnd()-0.5) + DR(3)=MCAMP(2)*(grnd()-0.5) + + DO 20 I=IT1,IT2 + RP(I,1)=R(I,1)+DR(1) + RP(I,2)=R(I,2)+DR(2) + RP(I,3)=R(I,3)+DR(3) + UP(I,1)=U(I,1) + UP(I,2)=U(I,2) + UP(I,3)=U(I,3) + 20 CONTINUE + +! Perform pivot move (MCTYPE 3) + + elseif (MCTYPE.EQ.3) then + + IP=nint(0.5+grnd()*NP) + IB1=nint(0.5+grnd()*N) + if (IB1.LT.(N/2.)) then + IB2=IB1 + IB1=1 + IT1=N*(IP-1)+IB1 + IT2=N*(IP-1)+IB2 + P1(1)=R(IT2,1) + P1(2)=R(IT2,2) + P1(3)=R(IT2,3) + else + IB2=N + IT1=N*(IP-1)+IB1 + IT2=N*(IP-1)+IB2 + P1(1)=R(IT1,1) + P1(2)=R(IT1,2) + P1(3)=R(IT1,3) + endif + + ALPHA=2.*PI*grnd() + BETA=acos(2.*grnd()-1.) + TA(1)=sin(BETA)*cos(ALPHA) + TA(2)=sin(BETA)*sin(ALPHA) + TA(3)=cos(BETA) + + ALPHA=MCAMP(3)*(grnd()-0.5) + + ROT(1,1)=TA(1)**2.+(TA(2)**2.+TA(3)**2.)*cos(ALPHA) + ROT(1,2)=TA(1)*TA(2)*(1.-cos(ALPHA))-TA(3)*sin(ALPHA) + ROT(1,3)=TA(1)*TA(3)*(1.-cos(ALPHA))+TA(2)*sin(ALPHA) + ROT(1,4)=(P1(1)*(1.-TA(1)**2.) & + -TA(1)*(P1(2)*TA(2)+P1(3)*TA(3)))*(1.-cos(ALPHA))+(P1(2)*TA(3)-P1(3)*TA(2))*sin(ALPHA) + + ROT(2,1)=TA(1)*TA(2)*(1.-cos(ALPHA))+TA(3)*sin(ALPHA) + ROT(2,2)=TA(2)**2.+(TA(1)**2.+TA(3)**2.)*cos(ALPHA) + ROT(2,3)=TA(2)*TA(3)*(1.-cos(ALPHA))-TA(1)*sin(ALPHA) + ROT(2,4)=(P1(2)*(1.-TA(2)**2.) & + -TA(2)*(P1(1)*TA(1)+P1(3)*TA(3)))*(1.-cos(ALPHA))+(P1(3)*TA(1)-P1(1)*TA(3))*sin(ALPHA) + + ROT(3,1)=TA(1)*TA(3)*(1.-cos(ALPHA))-TA(2)*sin(ALPHA) + ROT(3,2)=TA(2)*TA(3)*(1.-cos(ALPHA))+TA(1)*sin(ALPHA) + ROT(3,3)=TA(3)**2.+(TA(1)**2.+TA(2)**2.)*cos(ALPHA) + ROT(3,4)=(P1(3)*(1.-TA(3)**2.) & + -TA(3)*(P1(1)*TA(1)+P1(2)*TA(2)))*(1.-cos(ALPHA))+(P1(1)*TA(2)-P1(2)*TA(1))*sin(ALPHA) + + DO 30 I=IT1,IT2 + RP(I,1)=ROT(1,4)+ROT(1,1)*R(I,1)+ROT(1,2)*R(I,2)+ROT(1,3)*R(I,3) + RP(I,2)=ROT(2,4)+ROT(2,1)*R(I,1)+ROT(2,2)*R(I,2)+ROT(2,3)*R(I,3) + RP(I,3)=ROT(3,4)+ROT(3,1)*R(I,1)+ROT(3,2)*R(I,2)+ROT(3,3)*R(I,3) + UP(I,1)=ROT(1,1)*U(I,1)+ROT(1,2)*U(I,2)+ROT(1,3)*U(I,3) + UP(I,2)=ROT(2,1)*U(I,1)+ROT(2,2)*U(I,2)+ROT(2,3)*U(I,3) + UP(I,3)=ROT(3,1)*U(I,1)+ROT(3,2)*U(I,2)+ROT(3,3)*U(I,3) + 30 CONTINUE + +! Perform rotate move (MCTYPE 4) + + elseif (MCTYPE.EQ.4) then + + IP=nint(0.5+grnd()*NP) + IB1=nint(0.5+grnd()*N) + IB2=IB1 + IT1=N*(IP-1)+IB1 + IT2=N*(IP-1)+IB2 + + ALPHA=2.*PI*grnd() + BETA=acos(2.*grnd()-1.) + TA(1)=sin(BETA)*cos(ALPHA) + TA(2)=sin(BETA)*sin(ALPHA) + TA(3)=cos(BETA) + + ALPHA=MCAMP(4)*(grnd()-0.5) + + ROT(1,1)=TA(1)**2.+(TA(2)**2.+TA(3)**2.)*cos(ALPHA) + ROT(1,2)=TA(1)*TA(2)*(1.-cos(ALPHA))-TA(3)*sin(ALPHA) + ROT(1,3)=TA(1)*TA(3)*(1.-cos(ALPHA))+TA(2)*sin(ALPHA) + + ROT(2,1)=TA(1)*TA(2)*(1.-cos(ALPHA))+TA(3)*sin(ALPHA) + ROT(2,2)=TA(2)**2.+(TA(1)**2.+TA(3)**2.)*cos(ALPHA) + ROT(2,3)=TA(2)*TA(3)*(1.-cos(ALPHA))-TA(1)*sin(ALPHA) + + ROT(3,1)=TA(1)*TA(3)*(1.-cos(ALPHA))-TA(2)*sin(ALPHA) + ROT(3,2)=TA(2)*TA(3)*(1.-cos(ALPHA))+TA(1)*sin(ALPHA) + ROT(3,3)=TA(3)**2.+(TA(1)**2.+TA(2)**2.)*cos(ALPHA) + + I=IT1 + UP(I,1)=ROT(1,1)*U(I,1)+ROT(1,2)*U(I,2)+ROT(1,3)*U(I,3) + UP(I,2)=ROT(2,1)*U(I,1)+ROT(2,2)*U(I,2)+ROT(2,3)*U(I,3) + UP(I,3)=ROT(3,1)*U(I,1)+ROT(3,2)*U(I,2)+ROT(3,3)*U(I,3) + + RP(I,1)=R(I,1) + RP(I,2)=R(I,2) + RP(I,3)=R(I,3) + +! Perform a full chain rotation + + elseif (MCTYPE.EQ.5) then + + IP=nint(0.5+grnd()*NP) + IB1=1 + IB2=N + IT1=N*(IP-1)+IB1 + IT2=N*(IP-1)+IB2 + + ALPHA=2.*PI*grnd() + BETA=acos(2.*grnd()-1.) + TA(1)=sin(BETA)*cos(ALPHA) + TA(2)=sin(BETA)*sin(ALPHA) + TA(3)=cos(BETA) + + ! use ~central bead to put axes through + ! you could also use center of mass if you wanted + P1(1)=R((IT2+IT1)/2,1) + P1(2)=R((IT2+IT1)/2,2) + P1(3)=R((IT2+IT1)/2,3) + + ALPHA=MCAMP(5)*(grnd()-0.5) + + ROT(1,1)=TA(1)**2.+(TA(2)**2.+TA(3)**2.)*cos(ALPHA) + ROT(1,2)=TA(1)*TA(2)*(1.-cos(ALPHA))-TA(3)*sin(ALPHA) + ROT(1,3)=TA(1)*TA(3)*(1.-cos(ALPHA))+TA(2)*sin(ALPHA) + ROT(1,4)=(P1(1)*(1.-TA(1)**2.) & + -TA(1)*(P1(2)*TA(2)+P1(3)*TA(3)))*(1.-cos(ALPHA))+(P1(2)*TA(3)-P1(3)*TA(2))*sin(ALPHA) + + ROT(2,1)=TA(1)*TA(2)*(1.-cos(ALPHA))+TA(3)*sin(ALPHA) + ROT(2,2)=TA(2)**2.+(TA(1)**2.+TA(3)**2.)*cos(ALPHA) + ROT(2,3)=TA(2)*TA(3)*(1.-cos(ALPHA))-TA(1)*sin(ALPHA) + ROT(2,4)=(P1(2)*(1.-TA(2)**2.) & + -TA(2)*(P1(1)*TA(1)+P1(3)*TA(3)))*(1.-cos(ALPHA))+(P1(3)*TA(1)-P1(1)*TA(3))*sin(ALPHA) + + ROT(3,1)=TA(1)*TA(3)*(1.-cos(ALPHA))-TA(2)*sin(ALPHA) + ROT(3,2)=TA(2)*TA(3)*(1.-cos(ALPHA))+TA(1)*sin(ALPHA) + ROT(3,3)=TA(3)**2.+(TA(1)**2.+TA(2)**2.)*cos(ALPHA) + ROT(3,4)=(P1(3)*(1.-TA(3)**2.) & + -TA(3)*(P1(1)*TA(1)+P1(2)*TA(2)))*(1.-cos(ALPHA))+(P1(1)*TA(2)-P1(2)*TA(1))*sin(ALPHA) + + DO 40 I=IT1,IT2 + RP(I,1)=ROT(1,4)+ROT(1,1)*R(I,1)+ROT(1,2)*R(I,2)+ROT(1,3)*R(I,3) + RP(I,2)=ROT(2,4)+ROT(2,1)*R(I,1)+ROT(2,2)*R(I,2)+ROT(2,3)*R(I,3) + RP(I,3)=ROT(3,4)+ROT(3,1)*R(I,1)+ROT(3,2)*R(I,2)+ROT(3,3)*R(I,3) + UP(I,1)=ROT(1,1)*U(I,1)+ROT(1,2)*U(I,2)+ROT(1,3)*U(I,3) + UP(I,2)=ROT(2,1)*U(I,1)+ROT(2,2)*U(I,2)+ROT(2,3)*U(I,3) + UP(I,3)=ROT(3,1)*U(I,1)+ROT(3,2)*U(I,2)+ROT(3,3)*U(I,3) + 40 CONTINUE + +! Perform full chain slide move (MCTYPE 6) + + elseif (MCTYPE.EQ.6) then + + IP=nint(0.5+grnd()*NP) + IB1=1 + IB2=N + IT1=N*(IP-1)+IB1 + IT2=N*(IP-1)+IB2 + + DR(1)=MCAMP(6)*(grnd()-0.5) + DR(2)=MCAMP(6)*(grnd()-0.5) + DR(3)=MCAMP(6)*(grnd()-0.5) + + DO 50 I=IT1,IT2 + RP(I,1)=R(I,1)+DR(1) + RP(I,2)=R(I,2)+DR(2) + RP(I,3)=R(I,3)+DR(3) + UP(I,1)=U(I,1) + UP(I,2)=U(I,2) + UP(I,3)=U(I,3) + 50 CONTINUE + + endif + + RETURN + END + +!---------------------------------------------------------------! diff --git a/BasicWLC/MCcode/MC_self.f90 b/BasicWLC/MCcode/MC_self.f90 new file mode 100644 index 00000000..f61cce03 --- /dev/null +++ b/BasicWLC/MCcode/MC_self.f90 @@ -0,0 +1,226 @@ +!---------------------------------------------------------------* + +! +! This subroutine calculates the change in the self energy for +! a small Monte Carlo move in the position. +! +! Corrections to force magnitude made 6-3-04. +! +! Andrew Spakowitz +! Written 6-29-04 + + SUBROUTINE MC_self(DESELF,R,U,RP,UP,NT,N,NP,IP,IB1,IB2,IT1,IT2,LHC,VHC,LBOX,GAM) + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION RP(NT,3) ! Bead positions + DOUBLE PRECISION UP(NT,3) ! Tangent vectors + INTEGER N,NP,NT ! Number of beads + +! Variables for the calculation + + DOUBLE PRECISION U1(3),U2(3),U1U2 + DOUBLE PRECISION D1,D2 + DOUBLE PRECISION R12(3),D12,E12(3) + DOUBLE PRECISION S1,S2 + DOUBLE PRECISION GI(3) + INTEGER I1,J1,I2,J2 + INTEGER IMIN,IMAX + INTEGER IB1,IB2 + INTEGER IND1,IND2 + + INTEGER I ! Current test index + INTEGER J ! Index holder + INTEGER SKIP ! Bead skip index + DOUBLE PRECISION DESELF + DOUBLE PRECISION EMAG + +! Parameters in the simulation + + DOUBLE PRECISION LHC ! HC length + DOUBLE PRECISION SIGP ! HC diameter + DOUBLE PRECISION VHC ! Potential strengths + DOUBLE PRECISION GAM + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION SUM + DOUBLE PRECISION DT + DOUBLE PRECISION XIR + +! Calculate the self-interaction forces + + DESELF=0. + if (IB1.EQ.1) then + IMIN=1 + else + IMIN=IB1-1 + endif + if (IB2.EQ.N) then + IMAX=(N-1) + else + IMAX=IB2 + endif + + DO 30 I1=1,NP + if (I1.EQ.IP) then + goto 100 + endif + + DO 40 J1=1,(N-1) + IND1=J1+N*(I1-1) + I2=IP + + DO 50 J2=IMIN,IMAX + IND2=J2+N*(I2-1) + R12(1)=R(IND2,1)-R(IND1,1) + R12(2)=R(IND2,2)-R(IND1,2) + R12(3)=R(IND2,3)-R(IND1,3) + R12(1)=R12(1)-nint(R12(1)/LBOX)*LBOX + R12(2)=R12(2)-nint(R12(2)/LBOX)*LBOX + R12(3)=R12(3)-nint(R12(3)/LBOX)*LBOX + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + if (D12.GT.(3.*GAM)) then + goto 70 + endif + + U1(1)=R(IND1+1,1)-R(IND1,1) + U1(2)=R(IND1+1,2)-R(IND1,2) + U1(3)=R(IND1+1,3)-R(IND1,3) + D1=sqrt(U1(1)**2.+U1(2)**2.+U1(3)**2.) + U1(1)=U1(1)/D1 + U1(2)=U1(2)/D1 + U1(3)=U1(3)/D1 + + U2(1)=R(IND2+1,1)-R(IND2,1) + U2(2)=R(IND2+1,2)-R(IND2,2) + U2(3)=R(IND2+1,3)-R(IND2,3) + D2=sqrt(U2(1)**2.+U2(2)**2.+U2(3)**2.) + U2(1)=U2(1)/D2 + U2(2)=U2(2)/D2 + U2(3)=U2(3)/D2 + + U1U2=U1(1)*U2(1)+U1(2)*U2(2)+U1(3)*U2(3) + if (U1U2.EQ.1.) then + goto 70 + endif + + GI(1)=U1(1)-U1U2*U2(1) + GI(2)=U1(2)-U1U2*U2(2) + GI(3)=U1(3)-U1U2*U2(3) + + S1=(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S1.GT.D1.OR.S1.LT.0.) then + goto 70 + endif + + GI(1)=U2(1)-U1U2*U1(1) + GI(2)=U2(2)-U1U2*U1(2) + GI(3)=U2(3)-U1U2*U1(3) + + S2=-(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S2.GT.D2.OR.S2.LT.0.) then + goto 70 + endif + + R12(1)=R12(1)+S2*U2(1)-S1*U1(1) + R12(2)=R12(2)+S2*U2(2)-S1*U1(2) + R12(3)=R12(3)+S2*U2(3)-S1*U1(3) + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + + if (D12.GT.LHC) then + goto 70 + endif + + EMAG=VHC*((LHC/D12)**12.-2.*(LHC/D12)**6.+1.)/12. + + DESELF=DESELF-EMAG + + 70 CONTINUE + + 50 CONTINUE + + DO 80 J2=IMIN,IMAX + IND2=J2+N*(I2-1) + R12(1)=RP(IND2,1)-R(IND1,1) + R12(2)=RP(IND2,2)-R(IND1,2) + R12(3)=RP(IND2,3)-R(IND1,3) + R12(1)=R12(1)-nint(R12(1)/LBOX)*LBOX + R12(2)=R12(2)-nint(R12(2)/LBOX)*LBOX + R12(3)=R12(3)-nint(R12(3)/LBOX)*LBOX + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + if (D12.GT.(3.*GAM)) then + goto 90 + endif + + U1(1)=R(IND1+1,1)-R(IND1,1) + U1(2)=R(IND1+1,2)-R(IND1,2) + U1(3)=R(IND1+1,3)-R(IND1,3) + D1=sqrt(U1(1)**2.+U1(2)**2.+U1(3)**2.) + U1(1)=U1(1)/D1 + U1(2)=U1(2)/D1 + U1(3)=U1(3)/D1 + + U2(1)=RP(IND2+1,1)-RP(IND2,1) + U2(2)=RP(IND2+1,2)-RP(IND2,2) + U2(3)=RP(IND2+1,3)-RP(IND2,3) + D2=sqrt(U2(1)**2.+U2(2)**2.+U2(3)**2.) + U2(1)=U2(1)/D2 + U2(2)=U2(2)/D2 + U2(3)=U2(3)/D2 + + U1U2=U1(1)*U2(1)+U1(2)*U2(2)+U1(3)*U2(3) + if (U1U2.EQ.1.) then + goto 90 + endif + + GI(1)=U1(1)-U1U2*U2(1) + GI(2)=U1(2)-U1U2*U2(2) + GI(3)=U1(3)-U1U2*U2(3) + + S1=(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S1.GT.D1.OR.S1.LT.0.) then + goto 90 + endif + + GI(1)=U2(1)-U1U2*U1(1) + GI(2)=U2(2)-U1U2*U1(2) + GI(3)=U2(3)-U1U2*U1(3) + + S2=-(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S2.GT.D2.OR.S2.LT.0.) then + goto 90 + endif + + R12(1)=R12(1)+S2*U2(1)-S1*U1(1) + R12(2)=R12(2)+S2*U2(2)-S1*U1(2) + R12(3)=R12(3)+S2*U2(3)-S1*U1(3) + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + + if (D12.GT.LHC) then + goto 90 + endif + + EMAG=VHC*((LHC/D12)**12.-2.*(LHC/D12)**6.+1.)/12. + + DESELF=DESELF+EMAG + + 90 CONTINUE + 80 CONTINUE + + + 40 CONTINUE + 100 CONTINUE + 30 CONTINUE + + RETURN + END + +!---------------------------------------------------------------* + diff --git a/BasicWLC/MCcode/MCsim.f90 b/BasicWLC/MCcode/MCsim.f90 new file mode 100644 index 00000000..b37a2933 --- /dev/null +++ b/BasicWLC/MCcode/MCsim.f90 @@ -0,0 +1,253 @@ +!---------------------------------------------------------------* + +! This subroutine performs a Monte Carlo simulation on the +! polymer chain. + + SUBROUTINE MCsim(R,U,NT,N,NP,NSTEP,BROWN, & + INTON,IDUM,PARA,MCAMP,SUCCESS,MOVEON,WINDOW,SIMTYPE) + + use mt19937, only : grnd + + PARAMETER (PI=3.141592654) ! Value of pi + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION RP(NT,3) ! Bead positions + DOUBLE PRECISION UP(NT,3) ! Tangent vectors + INTEGER N,NP,NT ! Number of beads + INTEGER NSTEP ! Number of MC steps + INTEGER BROWN ! Turn on fluctuations + INTEGER INTON ! Include polymer interactions + +! Variables for the simulation + + INTEGER ISTEP ! Current MC step index + DOUBLE PRECISION PROB ! Calculated test prob + DOUBLE PRECISION TEST ! Random test variable + INTEGER IB ! Test bead + INTEGER IP ! Test polymer + INTEGER IB1 ! Test bead position 1 + INTEGER IT1 ! Index of test bead 1 + INTEGER IB2 ! Test bead position 2 + INTEGER IT2 ! Index of test bead 2 + + INTEGER TEMP + REAL ran1 ! Random number generator + INTEGER IDUM ! Seed for the generator + INTEGER NOW(3) ! Time now (hr,min,sec) + INTEGER I + DOUBLE PRECISION R0(3) + +! Energy variables + + DOUBLE PRECISION DEELAS ! Change in bending energy + DOUBLE PRECISION DESELF ! Change in self energy + DOUBLE PRECISION DEEX ! Change in external energy + DOUBLE PRECISION ENERGY + DOUBLE PRECISION DECOM ! Change in the compression energy + +! MC adaptation variables + + DOUBLE PRECISION MCAMP(6) ! Amplitude of random change + INTEGER MCTYPE ! Type of MC move + INTEGER NADAPT(6) ! Num steps btwn adapt + DOUBLE PRECISION PHIT ! % hits per total steps + DOUBLE PRECISION PDESIRE(6) ! Desired hit rate + INTEGER SUCCESS(6) ! Number of successes + DOUBLE PRECISION MINAMP(6)! Minimum amp to stop + DOUBLE PRECISION MAXAMP(6)! Minimum amp to stop + INTEGER MOVEON(6) ! Is the move active + INTEGER WINDOW(6) ! Size of window for bead selection + INTEGER SIMTYPE ! Simulation method (WLC=1,SSWLC=2,GC=3) + +! Variables in the simulation + + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + DOUBLE PRECISION XIR,XIU + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION LHC ! Length of HC int + DOUBLE PRECISION VHC ! HC strength + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION FCOM + +! Load the input parameters + + EB=PARA(1) + EPAR=PARA(2) + EPERP=PARA(3) + GAM=PARA(4) + ETA=PARA(5) + XIR=PARA(6) + XIU=PARA(7) + LBOX=PARA(8) + FCOM=PARA(9) + VHC=PARA(10) + + MINAMP(1)=0.0*PI + MINAMP(2)=0.0 + MINAMP(3)=0.0*PI + MINAMP(4)=0.0*PI + MINAMP(5)=0.1*PI + MINAMP(6)=0.01 + + MAXAMP(1)=2.*PI + MAXAMP(2)=LBOX + MAXAMP(3)=2.*PI + MAXAMP(4)=2.*PI + MAXAMP(5)=2.*PI + MAXAMP(6)=LBOX + + NADAPT(1)=1000 + NADAPT(2)=1000 + NADAPT(3)=1000 + NADAPT(4)=1000 + NADAPT(5)=1000 + NADAPT(6)=1000 + if (NSTEP.LE.NADAPT(1)) then + NADAPT(1)=NSTEP + endif + if (NSTEP.LE.NADAPT(2)) then + NADAPT(2)=NSTEP + endif + if (NSTEP.LE.NADAPT(3)) then + NADAPT(3)=NSTEP + endif + if (NSTEP.LE.NADAPT(4)) then + NADAPT(4)=NSTEP + endif + if (NSTEP.LE.NADAPT(5)) then + NADAPT(5)=NSTEP + endif + + PDESIRE(1)=0.5 + PDESIRE(2)=0.5 + PDESIRE(3)=0.5 + PDESIRE(4)=0.5 + PDESIRE(5)=0.5 + PDESIRE(6)=0.5 + + SUCCESS(1)=0 + SUCCESS(2)=0 + SUCCESS(3)=0 + SUCCESS(4)=0 + SUCCESS(5)=0 + SUCCESS(6)=0 + + DEELAS=0. + DESELF=0. + DEEX=0. + + +! Begin Monte Carlo simulation + + ISTEP=1 + + DO WHILE (ISTEP.LE.NSTEP) + + DO 10 MCTYPE=1,6 + + if (MOVEON(MCTYPE).EQ.0) then + goto 60 + endif + + call MC_move(R,U,RP,UP,NT,N,NP,IP,IB1,IB2,IT1,IT2,IDUM,MCTYPE,MCAMP) + + if (SIMTYPE.EQ.1.AND.abs(IB2-IB1).LE.1) then + goto 60 + endif + +! Calculate the change in polymer elastic energy using +! SIMTYPE indicates simulation method (WLC=1,SSWLC=2,GC=3) + + call MC_eelas(DEELAS,R,U,RP,UP,NT,N,NP,IP, & + IB1,IB2,IT1,IT2,EB,EPAR,EPERP,GAM,ETA,SIMTYPE) + +! Calculate the change in the self-interaction energy + + if (INTON.EQ.1) then + call MC_self(DESELF,R,U,RP,UP,NT,N,NP,IP,IB1,IB2,IT1,IT2,LHC,VHC,LBOX,GAM) + endif + +! Calculate the change in the external force energy + + DECOM=0. + if (IB1.EQ.1.AND.IB2.EQ.N) then + DECOM=FCOM*(sqrt((RP(IT2,1)-RP(IT1,1))**2.+(RP(IT2,2)-RP(IT1,2))**2.+(RP(IT2,3)-RP(IT1,3))**2.) & + -sqrt((R(IT2,1)-R(IT1,1))**2.+(R(IT2,2)-R(IT1,2))**2.+(R(IT2,3)-R(IT1,3))**2.)) + elseif (IB1.EQ.1.AND.IB2.NE.N) then + DECOM=FCOM*(sqrt((R(N*IP,1)-RP(IT1,1))**2.+(R(N*IP,2)-RP(IT1,2))**2.+(R(N*IP,3)-RP(IT1,3))**2.) & + -sqrt((R(N*IP,1)-R(IT1,1))**2.+(R(N*IP,2)-R(IT1,2))**2.+(R(N*IP,3)-R(IT1,3))**2.)) + elseif (IB1.NE.1.AND.IB2.EQ.N) then + DECOM=FCOM*(sqrt((RP(IT2,1)-R(1+N*(IP-1),1))**2.+(RP(IT2,2)-R(1+N*(IP-1),2))**2.+(RP(IT2,3)-R(1+N*(IP-1),3))**2.) & + -sqrt((R(IT2,1)-R(1+N*(IP-1),1))**2.+(R(IT2,2)-R(1+N*(IP-1),2))**2.+(R(IT2,3)-R(1+N*(IP-1),3))**2.)) + endif + +! Change the position if appropriate + + ENERGY=DEELAS+DESELF+DECOM + + PROB=exp(-ENERGY) + if (BROWN.EQ.1) then + TEST=grnd() + else + TEST=1. + endif + if (TEST.LE.PROB) then + DO 20 I=IT1,IT2 + R(I,1)=RP(I,1) + R(I,2)=RP(I,2) + R(I,3)=RP(I,3) + U(I,1)=UP(I,1) + U(I,2)=UP(I,2) + U(I,3)=UP(I,3) + 20 CONTINUE + SUCCESS(MCTYPE)=SUCCESS(MCTYPE)+1 + endif + +! Adapt the amplitude of step every NADAPT steps + + if (mod(ISTEP,NADAPT(MCTYPE)).EQ.0) then + PHIT=real(SUCCESS(MCTYPE))/real(NADAPT(MCTYPE)) + if (PHIT.GT.PDESIRE(MCTYPE)) then + MCAMP(MCTYPE)=MCAMP(MCTYPE)*1.05 + else + MCAMP(MCTYPE)=MCAMP(MCTYPE)*0.95 + endif + if (MCAMP(MCTYPE).GT.MAXAMP(MCTYPE)) then + MCAMP(MCTYPE)=MAXAMP(MCTYPE) + endif + if (MCAMP(MCTYPE).LT.MINAMP(MCTYPE)) then + MCAMP(MCTYPE)=MINAMP(MCTYPE) + endif + + SUCCESS(MCTYPE)=0 + + IB=1 + DO 40 I=1,NP + R0(1)=nint(R(IB,1)/LBOX-0.5)*LBOX + R0(2)=nint(R(IB,2)/LBOX-0.5)*LBOX + R0(3)=nint(R(IB,3)/LBOX-0.5)*LBOX + DO 50 J=1,N + R(IB,1)=R(IB,1)-R0(1) + R(IB,2)=R(IB,2)-R0(2) + R(IB,3)=R(IB,3)-R0(3) + IB=IB+1 + 50 CONTINUE + 40 CONTINUE + + endif + + 60 CONTINUE + + + 10 CONTINUE + + ISTEP=ISTEP+1 + + ENDDO + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/MISCcode/genutil.f90 b/BasicWLC/MISCcode/genutil.f90 new file mode 100644 index 00000000..c0cc7abe --- /dev/null +++ b/BasicWLC/MISCcode/genutil.f90 @@ -0,0 +1,279 @@ +MODULE GENUTIL + ! generally useful utilities + USE MT19937 ! mersenne random number generator + USE QUATUTIL ! utilities for dealing with quaternions + + IMPLICIT NONE + +CONTAINS + + INTEGER FUNCTION STRING2NUM(STRINGIN,APPENDNUM) + ! convert the string to a unique number based on ascii characters + ! the characters SPACE, {,},(,),[,],",`,<,> and all nonprintable characters are ignored + ! at most the last five characters (ignoring the unacceptable characters above) at the end of the string are used + ! any leading "!" do not affect the final number (these map to 0) + ! if APPENDNUM is specificied, only use the last 4 characters of the string as well as the additional number modulo 84 + + IMPLICIT NONE + CHARACTER(LEN=*) :: STRINGIN + CHARACTER(LEN=5) :: STRING + INTEGER, OPTIONAL :: APPENDNUM + INTEGER :: DIGARRAY(5) + INTEGER :: ALLOWED(84) + INTEGER :: N, I, D, COUNT + CHARACTER*84 :: ALLOWEDSTR + + ! set the allowed characters + ALLOWED(1:6) = (/33,35,36,37,38,39/) + ALLOWED(7:24) = (/(I,I=42,59)/) + ALLOWED(25:27) = (/61,63,64/) + ALLOWED(28:53) = (/(I, I=65,90)/) + ALLOWED(54:56) = (/92,94,95/) + ALLOWED(57:82) = (/(I, I=97,122)/) + ALLOWED(83:84) = (/124,126/) + + N = LEN(STRINGIN) + IF (PRESENT(APPENDNUM)) THEN + STRING(1:4) = STRINGIN(N-3:N) + STRING(5:5) = ACHAR(ALLOWED(MOD(APPENDNUM,84)+1)) + ELSE + STRING = STRINGIN(N-4:N) + ENDIF + N = 5 + + + DO I = 1,84 + ALLOWEDSTR(I:I) = ACHAR(ALLOWED(I)) + ENDDO + + DIGARRAY = 0 + COUNT = 0 + DO I = 0,N-1 + D = INDEX(ALLOWEDSTR,STRING(N-I:N-I),.FALSE.) + IF (D.EQ.0) THEN + print*, 'Ignoring character:', D + CYCLE + ENDIF + + DIGARRAY(5-COUNT) = D-1 + COUNT = COUNT + 1 + IF (COUNT.GE.5) EXIT + ENDDO + + STRING2NUM = BASE2DEC(DIGARRAY,5,84) + END FUNCTION STRING2NUM + + INTEGER FUNCTION BASE2DEC(DIGARRAY,N,BASE) + ! given a number in some integer base (specified as a list of digits) + ! convert that number to a decimal integer + ! N is the size of the list + ! if resulting number is too large, wrap around to negative numbers + ! starting from the right, only use as many of the digits as + ! will fit into the resulting integer between -HUGE and HUGE + ! if any digit is greater than base-1, print error and stop + + IMPLICIT NONE + INTEGER, DIMENSION(N) :: DIGARRAY + INTEGER, INTENT(IN) :: N, BASE + INTEGER :: MAXDIG, I, D + + MAXDIG = INT(LOG(2*DBLE(HUGE(BASE))+2)/LOG(DBLE(BASE))) + + BASE2DEC = 0 + DO I = 0, MIN(N-1,MAXDIG-1) + D = DIGARRAY(N-I) + IF (D.EQ.0) CYCLE + IF (D.GT.BASE-1) THEN + PRINT*, 'ERROR in BASE2DEC: digit is bigger than base.', I, D, BASE + STOP 1 + ENDIF + + BASE2DEC = BASE2DEC + D*BASE**I + ENDDO + + END FUNCTION BASE2DEC + + SUBROUTINE INTERPARRAY(ARRAY,NA,COL,VAL,IND,INTERP) + ! for an 2D array with dimensions NA + ! use the values in column COL to interpolate for the value VAL + ! return the index IND such that ARRAY(IND,COL)0 for yes) + INTEGER, PARAMETER :: MAXFIXBEAD = 100 + INTEGER :: NFIXBEAD + INTEGER :: FIXBEAD(MAXFIXBEAD,4) + ! fix all bead positions for top/bottom and or side boundaries + ! 1) top/bottom fixed 2) sides fixed + ! 3) fix positions 4) fix orientations + LOGICAL :: FIXBOUNDARY(4) + ! force a shear deformation + LOGICAL :: SETSHEAR + DOUBLE PRECISION :: SHEARGAMMA + ! start with collapsed structure + LOGICAL :: STARTCOLLAPSE + + LOGICAL :: DOLOCALMOVES +END MODULE KEYS diff --git a/BasicWLC/MISCcode/param.loopL4N10_a2 b/BasicWLC/MISCcode/param.loopL4N10_a2 new file mode 100644 index 00000000..1a7c7eb4 --- /dev/null +++ b/BasicWLC/MISCcode/param.loopL4N10_a2 @@ -0,0 +1,22 @@ +ACTION browndyn +RUNGEKUTTA 4 +NCHAIN 1000 +BDSTEPS 200000 0.5 T +RNGSEED 0 +LS 0.400000 +NPT 11 11 +STRETCHABLE T +SHEARABLE T +COUPLED T +LP 1.560407 +GAM 0.925108 +EPAR 105.621667 +EPERP 130.984758 +EC -10.090547 +FRICT 1D0 0.0008965000 T +DELTSCL 0.022216345092025 +STARTEQUIL 2 +LOOPING 0.20 *.loop.out +INTERPPARAMS T dssWLCparams.txt +DYNAMICREDISC 0 5 1 1 +# \ No newline at end of file diff --git a/BasicWLC/MISCcode/quatutil.f90 b/BasicWLC/MISCcode/quatutil.f90 new file mode 100644 index 00000000..5bad33ff --- /dev/null +++ b/BasicWLC/MISCcode/quatutil.f90 @@ -0,0 +1,832 @@ +MODULE QUATUTIL + ! utilities for dealing with quaternions + ! and other representations of rotation + ! including euler angles, rotation matrices, and alpha+gamma and z-axis-vector representations + + IMPLICIT NONE + LOGICAL :: TESTQUAT = .FALSE. + DOUBLE PRECISION, PARAMETER :: PI = 3.141592653589793D0 + ! when z1^2+z2^2 goes below tiny when working with alpha+gamma & zvec coordinates + ! use the v->0 approximation + DOUBLE PRECISION, PARAMETER :: NZTINY=1D-14 + + ! definition of a quaternion class + TYPE QUATERNION + DOUBLE PRECISION :: W, X, Y, Z + END TYPE QUATERNION + + INTERFACE OPERATOR (*) + MODULE PROCEDURE QPRODUCT + END INTERFACE + + INTERFACE OPERATOR (/) + MODULE PROCEDURE QDIVIDE + END INTERFACE + +CONTAINS + SUBROUTINE QUAT2SCREW(QUAT,TRANS,HELCRD) + ! convert from a rotation+translation to screw coordinates + ! (equivalently to overall helix coordinates) + ! returns height, angle, radius, orientation of + ! canonical system relative to helix system (3 euler angles) + TYPE(QUATERNION), INTENT(IN) :: QUAT + DOUBLE PRECISION, INTENT(IN) :: TRANS(3) + DOUBLE PRECISION, INTENT(OUT) :: HELCRD(6) + DOUBLE PRECISION :: THETA, AX(3), TP(3), ST2, CT2, AXT3, A, B, G, NP, NTP + + ! angle-axis representation from quaternion + THETA = 2*ACOS(QUAT%W) + + IF (THETA.EQ.0D0) THEN ! translation only + HELCRD(1) = SQRT(DOT_PRODUCT(TRANS,TRANS)) + HELCRD(2) = 0D0 + HELCRD(3) = 0D0 + HELCRD(4:6) = (/0D0,0D0,0D0/) + RETURN + ENDIF + + ! angle of rotation around screw axis + HELCRD(2) = THETA + + AX = (/QUAT%X,QUAT%Y,QUAT%Z/); + ST2 = SIN(THETA/2) + AX = AX/ST2; ! normalize the axis + + ! shift along screw axis + HELCRD(1) = DOT_PRODUCT(TRANS,AX) + + ! translation in plane perpendicular to axis + TP = TRANS - HELCRD(1)*AX + NTP = SQRT(DOT_PRODUCT(TP,TP)) + + ! radius of screw + NP = NTP/(2*ST2) + HELCRD(3) = NP + + ! cross-product of AX x TP + AXT3 = AX(1)*TP(2) - AX(2)*TP(1) + + ! euler angles of screw axis coord system relative to canonical + A = atan2(AX(1),-AX(2)) + B = ACOS(AX(3)) + CT2 = QUAT%W/ST2 + G = ATAN2(-TP(3)-CT2*AXT3,-AXT3+CT2*TP(3)) + + ! euler angles of canonical system relative to screw axis + HELCRD(4:6) = (/PI-G,B,PI-A/) + END SUBROUTINE QUAT2SCREW + + SUBROUTINE COORDS2QUAT(AG,ZVEC,Q) + ! convert from an alpha+gamma angle and a vector along the z axis + ! to a normalized quaternion + ! note: this doesn't work if beta = pi + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: AG, ZVEC(3) + TYPE(QUATERNION) :: Q + DOUBLE PRECISION :: NZ, ZAX(3), ALPHA,BETA,GAMMA + + NZ = SQRT(DOT_PRODUCT(ZVEC,ZVEC)) + ZAX = ZVEC/NZ + + NZ = ZAX(1)**2+ZAX(2)**2 + + IF (NZ.EQ.0) THEN + CALL EULER2QUAT((/AG,0D0,0D0/),Q) + ELSE + ALPHA = ATAN2(ZAX(1),-ZAX(2)); GAMMA = AG-ALPHA + BETA = ACOS(ZAX(3)) + CALL EULER2QUAT((/ALPHA,BETA,GAMMA/),Q) + ENDIF + + END SUBROUTINE COORDS2QUAT + + SUBROUTINE COORDS2ROTMAT(AG,ZVEC,MAT,DMATAG,DMATZ) + ! convert from coordinates that include the alpha+gamma euler angle + ! and a non-normalized vector along the Z axis in canonical reference system + ! to a rotation matrix + ! if DMATAG and DMATZ are provided, also get derivatives of all the matrix + ! components wrt the coordinates + + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: AG, ZVEC(3) + DOUBLE PRECISION, INTENT(OUT) :: MAT(3,3) + DOUBLE PRECISION, INTENT(OUT), OPTIONAL :: DMATAG(3,3), DMATZ(3,3,3) + DOUBLE PRECISION :: NZTOT2, NZTOT, NZ, Z1, Z2, Z3 + DOUBLE PRECISION :: Z11,Z22,Z12,Z13,Z23,CAG,SAG + DOUBLE PRECISION :: DXDZ(3,3),DYDZ(3,3) + + IF ((PRESENT(DMATAG).AND..NOT.PRESENT(DMATZ)).OR.& + & (.NOT.PRESENT(DMATAG).AND.PRESENT(DMATZ))) THEN + PRINT*, 'ERROR IN COORDS2ROTMAT: neither or both of DMATAG and DMATZ must be provided' + stop 1 + ENDIF + + MAT = 0D0 + + ! normalize the zaxis + NZTOT2 = DOT_PRODUCT(ZVEC,ZVEC); NZTOT = SQRT(NZTOT2) + MAT(:,3) = ZVEC/NZTOT + Z1 = MAT(1,3); Z2 = MAT(2,3); + Z11 = Z1*Z1; Z22 = Z2*Z2; + NZ = Z11+Z22; + Z3 = MAT(3,3) + Z12 = Z1*Z2; Z23 = Z2*Z3; Z13 = Z1*Z3 + + ! IF (Z3.LT.-1D0+SQRT(NZTINY)) THEN + ! PRINT*, 'ERROR IN COORDS2ROTMAT: have hit gimbal lock with Z axis pointing downward. Not set up to deal with this yet.' + ! STOP 1 + ! ENDIF + + CAG = COS(AG); SAG = SIN(AG) + + !IF (TESTQUAT) PRINT*, 'TESTX1', NZ, NZTINY + IF (NZ.LT.NZTINY) THEN + IF (ZVEC(3).LT.0) THEN + PRINT*, 'PROBLEM IN COORDS2ROTMAT: some z-vector falls along the & + & negative z axis. This causes gimbal lock. & + & If working with a single nucleosome you may be able to & + & avoid this by rotating the entire structure slightly, or & + & by using RANDSTART to start the linker beads in different positions.' + stop 1 + endif + MAT(1,1) = CAG - (Z12*SAG+Z11*CAG)/2 + !if (testquat) print*, 'testx2:', mat(1,1) + MAT(2,1) = SAG - (Z22*SAG+Z12*CAG)/2 + + MAT(1,2) = -SAG+(Z11*SAG-Z12*CAG)/2 + MAT(2,2) = CAG-(Z22*CAG-Z12*SAG)/2 + ELSE + MAT(1,1) = (Z22*CAG-Z12*SAG+Z3*(Z12*SAG+Z11*CAG))/NZ + MAT(2,1) = (-Z12*CAG + Z11*SAG+Z3*(Z22*SAG+Z12*CAG))/NZ + + MAT(1,2) = -(Z22*SAG+Z12*CAG+Z3*(-Z12*CAG+Z11*SAG))/NZ + !if (testquat) print*, 'testx2:', mat(1,2) + MAT(2,2) = (Z12*SAG+Z11*CAG+Z3*(Z22*CAG-Z12*SAG))/NZ + ENDIF + MAT(3,1) = -Z2*SAG-Z1*CAG + MAT(3,2) = -CAG*Z2+SAG*Z1 + + IF (PRESENT(DMATZ)) THEN + DMATZ = 0D0 + + ! derivative of normalized z axis wrt ZVEC coordinates (transposed) + DMATZ(:,3,1) = -ZVEC(1)*MAT(:,3)/NZTOT2 + (/1D0/NZTOT,0D0,0D0/) + DMATZ(:,3,2) = -ZVEC(2)*MAT(:,3)/NZTOT2 + (/0D0,1D0/NZTOT,0D0/) + DMATZ(:,3,3) = -ZVEC(3)*MAT(:,3)/NZTOT2 + (/0D0,0D0,1D0/NZTOT/) + + IF (NZ.LT.NZTINY) THEN + + DXDZ(1,1) = -Z2*SAG/2-Z1*CAG + DXDZ(1,2) = -Z1*SAG/2 + DXDZ(2,1) = -Z2*CAG/2 + DXDZ(2,2) = -Z2*SAG-Z1*CAG/2 + DXDZ(:,3) = 0D0 + + DYDZ(1,1) = Z1*SAG - Z2*CAG/2 + DYDZ(1,2) = -Z1*CAG/2 + DYDZ(2,1) = Z2*SAG/2 + DYDZ(2,2) = -Z2*CAG+Z1*SAG/2 + DYDZ(:,3) = 0D0 + ELSE + ! derivative wrt normalized z axis + DXDZ(1,1) = (-Z2*SAG+Z23*SAG+2*Z13*CAG-2*Z1*MAT(1,1))/NZ + DXDZ(1,2) = (2*Z2*CAG-Z1*SAG+Z13*SAG-2*Z2*MAT(1,1))/NZ + DXDZ(1,3) = (Z12*SAG+Z11*CAG)/NZ + + DXDZ(2,1) = (-Z2*CAG+2*Z1*SAG+Z23*CAG - 2*MAT(2,1)*Z1)/NZ + DXDZ(2,2) = (-Z1*CAG+2*Z23*SAG + Z13*CAG-2*MAT(2,1)*Z2)/NZ + DXDZ(2,3) = (Z22*SAG+Z12*CAG)/NZ + + DYDZ(1,1) = (-Z2*CAG+Z23*CAG-2*Z13*SAG-2*Z1*MAT(1,2))/NZ + DYDZ(1,2) = (-2*Z2*SAG-Z1*CAG+Z13*CAG-2*Z2*MAT(1,2))/NZ + DYDZ(1,3) = (Z12*CAG-Z11*SAG)/NZ + + DYDZ(2,1) = (Z2*SAG+2*Z1*CAG-Z23*SAG-2*Z1*MAT(2,2))/NZ + DYDZ(2,2) = (Z1*SAG+2*Z23*CAG-Z13*SAG-2*Z2*MAT(2,2))/NZ + DYDZ(2,3) = (Z22*CAG-Z12*SAG)/NZ + ENDIF + DXDZ(3,:) = (/-CAG,-SAG,0D0/) + DYDZ(3,:) = (/SAG,-CAG,0D0/) + + ! derivatives of new axes + + CALL DGEMM('N','N',3,3,3,1D0,DXDZ,3,DMATZ(:,3,:),3,0D0,DMATZ(:,1,:),3) + CALL DGEMM('N','N',3,3,3,1D0,DYDZ,3,DMATZ(:,3,:),3,0D0,DMATZ(:,2,:),3) + + + !CALL DGEMV('N',3,3,1D0,DZ,3,DMATZTMP(2,1,:),1,0D0,DMATZ(2,1,:),1) + !DMATZ(2,1,:) = DXDZ + ENDIF + + IF (PRESENT(DMATAG)) THEN + DMATAG = 0D0 + + IF (NZ.LT.NZTINY) THEN + DMATAG(1,1) = -SAG-(Z12*CAG-Z11*SAG)/2 + DMATAG(2,1) = CAG-(Z22*CAG-Z12*SAG)/2 + + DMATAG(1,2) = -CAG+(Z11*CAG+Z12*SAG)/2 + DMATAG(2,2) = -SAG+(Z22*SAG+Z12*CAG)/2 + ELSE + DMATAG(1,1) = (-Z22*SAG-Z1*Z2*CAG+Z1*Z23*CAG-Z3*Z11*SAG)/NZ + DMATAG(2,1) = (Z12*SAG+Z11*CAG + Z3*Z22*CAG-Z1*Z23*SAG)/NZ + + DMATAG(1,2) = (-Z22*CAG+Z12*SAG-Z1*Z23*SAG-Z3*Z11*CAG)/NZ + DMATAG(2,2) = (Z12*CAG-Z11*SAG-Z22*Z3*SAG-Z1*Z23*CAG)/NZ + ENDIF + DMATAG(3,1) = -Z2*CAG+Z1*SAG ! dX3/dA + DMATAG(3,2) = SAG*Z2+CAG*Z1! dY3/dA + ENDIF + END SUBROUTINE COORDS2ROTMAT + + ! ----------------- STUFF INVOLVING TREATING QUATERNIONS AS 4-VECTORS ----- + FUNCTION QUAT2QV(Q) + ! convert a quaternion object to a 4-vector + IMPLICIT NONE + DOUBLE PRECISION :: QUAT2QV(4) + TYPE(QUATERNION), INTENT(IN) :: Q + + QUAT2QV = (/Q%W,Q%X,Q%Y,Q%Z/) + END FUNCTION QUAT2QV + + SUBROUTINE ROTQV(THETA,AX,QV,DT) + ! get the quaternion corresponding to rotation around axis AX by angle THETA + ! as a 4-vector (in QV); optionally, also get the derivative wrt theta + ! WARNING: AX assumed to be normalized; does not check for this! + + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: THETA, AX(3) + DOUBLE PRECISION, INTENT(OUT) :: QV(4) + DOUBLE PRECISION, INTENT(OUT), OPTIONAL :: DT(4) + DOUBLE PRECISION :: CT, ST + + CT = COS(THETA/2); ST = SIN(THETA/2); + QV(1) = CT + QV(2:4) = ST*AX + + IF (PRESENT(DT)) THEN + DT(1) = -ST/2 + DT(2:4) = CT/2*AX + ENDIF + + END SUBROUTINE ROTQV + + SUBROUTINE QVPTMULT(Q,PT,QP,DQ,DPT) + ! multiply a quaternion by a point in 3-space + ! returns the result in QP + ! optionally, returns derivatives wrt the quaternion components in dQ + ! or wrt point components in DPT + ! WARNING: no normalization happens here + ! WARNING: this is a pretty inefficient way to do things; should fix at some point without resorting to rotation matrices + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: Q(4),PT(3) + DOUBLE PRECISION, INTENT(OUT) :: QP(3) + DOUBLE PRECISION, INTENT(OUT), OPTIONAL :: DQ(3,4),DPT(3,3) + DOUBLE PRECISION :: QN, QINV(4),QTMP(4),QTMP2(4) + DOUBLE PRECISION :: MAT(3,3),DMAT(3,3,4) + INTEGER :: I,J + TYPE(QUATERNION) :: QUAT + + QN = DOT_PRODUCT(Q,Q) + QUAT%W = Q(1); QUAT%X = Q(2); QUAT%Y = Q(3); QUAT%Z = Q(4) + IF (PRESENT(DQ)) THEN + CALL QUAT2ROTMAT(QUAT,MAT,dMAT) + ELSE + CALL QUAT2ROTMAT(QUAT,MAT) + ENDIF + DO I = 1,3 + QP(I) = DOT_PRODUCT(MAT(I,:),PT) + IF (PRESENT(DQ)) THEN + DO J = 1,4 + DQ(I,J) = DOT_PRODUCT(dMAT(I,:,J),PT) + ENDDO + ENDIF + ENDDO + + QP = QP/QN + IF (PRESENT(DQ)) THEN + DO I = 1,3 + DO J = 1,4 + DQ(I,J) = (DQ(I,J) - 2*Q(J)*QP(I))/QN + ENDDO + ENDDO + ENDIF + + IF (PRESENT(DPT)) THEN + DPT =MAT/QN + END IF + END SUBROUTINE QVPTMULT + + ! ----------------- STUFF INVOLVING QUATERNION OBJECTS ------------------- + + TYPE(QUATERNION) FUNCTION RHQINTERP(Q1,Q2,F) + ! interpolate from one quaternion to another always in a right-handed sense + ! (relative to the Q1 z-axis) + ! F should be between 0 and 1 + TYPE(QUATERNION) :: Q1, Q2 + DOUBLE PRECISION :: F + DOUBLE PRECISION :: ANG, AX(3), DIR + TYPE(QUATERNION) :: QREL + + ! relative quaternion for Q2 relative to Q1 + QREL = INVQUAT(Q1)*Q2 + + ! angle of rotation + ANG = ACOS(QREL%W)*2 + + ! axis of rotation + AX = (/QREL%X,QREL%Y,QREL%Z/); AX = AX/SQRT(DOT_PRODUCT(AX,AX)) + + DIR = DOT_PRODUCT(AX,QUAT2PT(Q1*PTQUAT((/0D0,0D0,1D0/))/Q1)) + + print*, 'testx2:', dir, ang, ax + + IF (DIR.LT.0) THEN + ! rotation axis points away from quaternion axis, so flip it + ANG = -ANG + AX = -AX + ENDIF + + QREL = ROTQUAT(ANG*F,AX) + + RHQINTERP = Q1*QREL + END FUNCTION RHQINTERP + + TYPE(QUATERNION) FUNCTION QSLERP(Q1,Q2,F) + ! Sphreical linear interpolation between two quaternions + ! F should be between 0 and 1 + TYPE(QUATERNION), INTENT(IN) :: Q1, Q2 + DOUBLE PRECISION, INTENT(IN) :: F + DOUBLE PRECISION :: QV1(4), QV2(4), ANG, QVANS(4) + + QV1 = (/Q1%W,Q1%X,Q1%Y,Q1%Z/) + QV2 = (/Q2%W, Q2%X, Q2%Y, Q2%Z/) + + ! angle between them + ANG = ACOS(DOT_PRODUCT(QV1,QV2)) + + QVANS = SIN((1-F)*ANG)/SIN(ANG)*QV1 + SIN(F*ANG)/SIN(ANG)*QV2 + + QSLERP%W = QVANS(1); QSLERP%X = QVANS(2); QSLERP%Y = QVANS(3); QSLERP%Z = QVANS(4); + END FUNCTION QSLERP + + SUBROUTINE QUAT2ROTMAT(Q,MAT,DMAT) + ! convert a quaternion object to a rotation matrix and optionally return derivatives + ! NOTE: no normalization + IMPLICIT NONE + TYPE(QUATERNION) :: Q + DOUBLE PRECISION, INTENT(OUT) :: MAT(3,3) + DOUBLE PRECISION, INTENT(OUT), OPTIONAL :: DMAT(3,3,4) + DOUBLE PRECISION :: A,B,C,D,AA,BB,CC,DD,AB,AC,AD,BC,BD,CD + + A = Q%W; B = Q%X; C = Q%Y; D = Q%Z + AA = A*A; BB = B*B; CC = C*C; DD = D*D + AB = 2*A*B; AC = 2*A*C; AD = 2*A*D + BC = 2*B*C; BD = 2*B*D + CD = 2*C*D + + MAT(1,:) = (/AA+BB-CC-DD,BC-AD,AC+BD/) + MAT(2,:) = (/AD+BC,AA-BB+CC-DD,CD-AB/) + MAT(3,:) = (/BD-AC,AB+CD,AA-BB-CC+DD/) + + IF (PRESENT(DMAT)) THEN + dMAT(1,:,1) = (/A,-D,C/) + dMAT(1,:,2) = (/B,C,D/) + dMAT(1,:,3) = (/-C,B,A/) + dMAT(1,:,4) = (/-D,-A,B/) + dMAT(2,:,1) = (/D,A,-B/) + dMAT(2,:,2) = (/C,-B,-A/) + dMAT(2,:,3) = (/B,C,D/) + dMAT(2,:,4) = (/A,-D,C/) + dMAT(3,:,1) = (/-C,B,A/) + dMAT(3,:,2) = (/D,A,-B/) + dMAT(3,:,3) = (/-A,D,-C/) + dMAT(3,:,4) = (/B,C,D/) + dMAT = dMAT*2 + ENDIF + END SUBROUTINE QUAT2ROTMAT + + TYPE(QUATERNION) FUNCTION ROTMAT2QUAT(R) + ! convert from a rotation matrix to a quaternion object + ! following Deibel, 2006 (but with the rotation matrix transposed) + ! R(:,3) has the z axis after rotation is applied, etc. + ! assumes R is orthonormal + IMPLICIT NONE + DOUBLE PRECISION :: R(3,3) + DOUBLE PRECISION :: R11, R22,R33, TMP + + R11 = R(1,1); R22 = R(2,2); R33 = R(3,3) + + IF (R22 .GE.-R33.AND.R11.GE.-R22.AND.R11.GE.-R33) THEN + TMP = SQRT(1+R11+R22+R33) + ROTMAT2QUAT%W = TMP/2 + ROTMAT2QUAT%X = (R(3,2)-R(2,3))/(TMP*2) + ROTMAT2QUAT%Y = (R(1,3)-R(3,1))/(TMP*2) + ROTMAT2QUAT%Z = (R(2,1)-R(1,2))/(TMP*2) + !PRINT*, 'TESTX1Q' + ELSEIF (R22.LE.-R33.AND.R11.GT.R22.AND.R11.GT.R33) THEN + TMP = SQRT(1+R11-R22-R33) + ROTMAT2QUAT%W = (R(3,2)-R(2,3))/(TMP*2) + ROTMAT2QUAT%X = TMP/2 + ROTMAT2QUAT%Y = (R(2,1)+R(1,2))/(TMP*2) + ROTMAT2QUAT%Z = (R(1,3)+R(3,1))/(TMP*2) + !PRINT*, 'TESTX2Q' + ELSEIF (R22.GT.R33.AND.R11.LT.R22.AND.R11.LE.-R33) THEN + TMP = SQRT(1-R11+R22-R33) + ROTMAT2QUAT%W = (R(1,3)-R(3,1))/(TMP*2) + ROTMAT2QUAT%X = (R(2,1)+R(1,2))/(TMP*2) + ROTMAT2QUAT%Y = TMP/2 + ROTMAT2QUAT%Z = (R(3,2)+R(2,3))/(TMP*2) + !PRINT*, 'TESTX3Q' + ELSEIF (R22.LT.R33.AND.R11.LE.-R22.AND.R11.LT.R33) THEN + TMP = SQRT(1D0-R11-R22+R33) + ROTMAT2QUAT%W = (R(2,1)-R(1,2))/(TMP*2) + ROTMAT2QUAT%X = (R(1,3)+R(3,1))/(TMP*2) + ROTMAT2QUAT%Y = (R(3,2)+R(2,3))/(TMP*2) + ROTMAT2QUAT%Z = TMP/2 + !PRINT*, 'TESTX4Q' + ELSE + PRINT*, 'ERROR IN ROTMAT2QUAT: bad rotation matrix' + PRINT*, R(1,:) + PRINT*, R(2,:) + PRINT*, R(3,:) + STOP 1 + ROTMAT2QUAT%W = 0; ROTMAT2QUAT%X = 0; ROTMAT2QUAT%Y = 0; ROTMAT2QUAT%Z = 0 + ENDIF + END FUNCTION ROTMAT2QUAT + + SUBROUTINE EULER2QUAT(EUL,Q,DERV,GETDERV) + ! convert from Euler angles (z-x-z convention) to a quaternion + ! if GETDERV is true, also get the derivatives of the quaternion components + ! with respect to the euler angles (4 rows by 3 columns) + ! WARNING: since the quaternion representation has more parameters, switching from quaternion + ! to euler and back again will not always give the exact same quaternion, though it + ! will give an equivalent one (eg: may invert all components) + + DOUBLE PRECISION, INTENT(IN) :: EUL(3) + TYPE(QUATERNION), INTENT(OUT) :: Q + DOUBLE PRECISION, INTENT(OUT),OPTIONAL :: DERV(4,3) + LOGICAL, INTENT(IN),OPTIONAL :: GETDERV + DOUBLE PRECISION :: CA,SA,CB,SB,CG,SG,ALPHA,GAMMA,BETA + LOGICAL :: FLIPBETA + + BETA = ANGLE2PI(EUL(2)) + FLIPBETA = BETA.GT.PI + ALPHA = EUL(1); GAMMA = EUL(3) + IF (BETA.GT.PI) THEN + BETA = 2*PI-BETA + GAMMA = GAMMA+PI + ALPHA = ALPHA+PI + ENDIF + + ALPHA = ANGLE2PI(ALPHA) + GAMMA = ANGLE2PI(GAMMA) + !IF (QUATTEST) THEN + ! PRINT*, 'TESTXE:', EUL + ! PRINT*, 'A,B,G:',ALPHA,BETA,GAMMA + !ENDIF + + CA = COS(ALPHA/2); SA = SIN(ALPHA/2) + CB = COS(BETA/2); SB = SIN(BETA/2) + CG = COS(GAMMA/2); SG = SIN(GAMMA/2) + + Q%W = CG*CB*CA - SG*CB*SA + Q%X = SG*SB*SA + CG*SB*CA + Q%Y = CG*SB*SA - SG*SB*CA + Q%Z = CG*CB*SA + SG*CB*CA + + IF (PRESENT(DERV)) THEN + IF (GETDERV) THEN + DERV(1,:) = 0.5D0*(/-CG*CB*SA - SG*CB*CA, -CG*SB*CA + SG*SB*SA, -SG*CB*CA - CG*CB*SA/) + DERV(2,:) = 0.5D0*(/SG*SB*CA - CG*SB*SA, SG*CB*SA + CG*CB*CA, CG*SB*SA - SG*SB*CA /) + DERV(3,:) = 0.5D0*(/CG*SB*CA + SG*SB*SA, CG*CB*SA - SG*CB*CA, -SG*SB*SA - CG*SB*CA/) + DERV(4,:) = 0.5D0*(/CG*CB*CA - SG*CB*SA, -CG*SB*SA - SG*SB*CA, -SG*CB*SA + CG*CB*CA/) + ENDIF + IF (FLIPBETA) THEN + DERV(:,2) = -DERV(:,2) + ENDIF + ENDIF + + END SUBROUTINE EULER2QUAT + + SUBROUTINE QUAT2EULER(Q,EUL) + ! get the Euler angles (z-x-z convention) corresponding to a unit quaternion + ! NOTE: the quaternion must already be normalized + ! currently can't handle gimbal lock + TYPE(QUATERNION), INTENT(IN) :: Q + DOUBLE PRECISION, INTENT(OUT) :: EUL(3) + DOUBLE PRECISION :: DUMMY + + EUL(2) = 1 - 2*(Q%X**2+Q%Y**2) + IF (EUL(2).GT.1) THEN + EUL(2) = 0D0 + ELSEIF (EUL(2).LT.-1) THEN + EUL(2) = PI + ELSE + EUL(2) = ACOS(EUL(2)) + ENDIF + + ! deal with the gimbal lock issues + IF (EUL(2).LE.EPSILON(0D0)) THEN + EUL(3) = ATAN2(2*(Q%X*Q%Y + Q%W*Q%Z), 1 - 2*(Q%Y**2+Q%Z**2)) + IF (EUL(3).LT.0) EUL(3) = 2*PI+EUL(3) + EUL(1) = 0D0 + RETURN + ELSEIF (EUL(2).GE.PI-EPSILON(0D0)) THEN + EUL(3) = ATAN2(-2*(Q%X*Q%Y + Q%W*Q%Z), 1 - 2*(Q%Y**2+Q%Z**2)) + IF (EUL(3).LT.0) EUL(3) = 2*PI+EUL(3) + EUL(1) = 0D0 + RETURN + ENDIF + + DUMMY = Q%W*Q%X-Q%Y*Q%Z + + EUL(1) = ATAN2(Q%W*Q%Y+Q%X*Q%Z, DUMMY) + IF (EUL(1).LT.0) EUL(1) = 2*PI+EUL(1) + + DUMMY = Q%W*Q%X+Q%Y*Q%Z + + EUL(3) = ATAN2(Q%X*Q%Z-Q%W*Q%Y,DUMMY) + IF (EUL(3).LT.0) EUL(3) = 2*PI+EUL(3) + + END SUBROUTINE QUAT2EULER + + FUNCTION QUAT2PT(Q) + ! get the point corresponding to a quaternion + TYPE(QUATERNION) :: Q + DOUBLE PRECISION :: QUAT2PT(3) + + QUAT2PT = (/Q%X,Q%Y,Q%Z/) + END FUNCTION QUAT2PT + + TYPE(QUATERNION) FUNCTION ROTQUAT(THETA,AX) + ! get the quaternion corresponding to rotation around unit axis AX + ! by an angle theta + DOUBLE PRECISION :: THETA, AX(3) + DOUBLE PRECISION :: T2, ST2 + + IF (ABS(SUM(AX**2)-1D0).GT.EPSILON(1d0)*10) THEN + print*, 'ERROR in ROTQUAT: Axis does not have unit norm' + STOP 1 + ENDIF + + T2 = THETA/2; ST2 = SIN(THETA/2) + ROTQUAT%W = COS(T2) + ROTQUAT%X = ST2*AX(1); ROTQUAT%Y = ST2*AX(2); ROTQUAT%Z=ST2*AX(3) + END FUNCTION ROTQUAT + + TYPE(QUATERNION) FUNCTION PTQUAT(P) + ! turn a 3d point into a quaternion + DOUBLE PRECISION :: P(3) + + PTQUAT%W = 0D0; PTQUAT%X = P(1); PTQUAT%Y = P(2); PTQUAT%Z = P(3) + END FUNCTION PTQUAT + + TYPE(QUATERNION) FUNCTION INVQUAT(Q) + ! get the inverse of a quaternion + IMPLICIT NONE + TYPE(QUATERNION), INTENT(IN) :: Q + DOUBLE PRECISION :: QN + + QN = Q%W**2+Q%X**2+Q%Y**2+Q%Z**2 + INVQUAT%W = Q%W/QN; INVQUAT%X = -Q%X/QN; INVQUAT%Y=-Q%Y/QN; INVQUAT%Z=-Q%Z/QN + + END FUNCTION INVQUAT + + TYPE(QUATERNION) FUNCTION QDIVIDE(P,Q) + ! multiply P by inverse of Q(in that order) + IMPLICIT NONE + TYPE(QUATERNION), INTENT(IN) :: P,Q + TYPE(QUATERNION) :: QINV + DOUBLE PRECISION :: QN + + ! inverse of the 2nd quaternion + QN = Q%W**2+Q%X**2+Q%Y**2+Q%Z**2 + QINV%W = Q%W/QN; QINV%X = -Q%X/QN; QINV%Y=-Q%Y/QN; QINV%Z=-Q%Z/QN + + QDIVIDE = P*QINV + END FUNCTION QDIVIDE + + TYPE(QUATERNION) FUNCTION QPRODUCT(P,Q) + ! quaternion multiplication + IMPLICIT NONE + TYPE(QUATERNION), INTENT(IN) :: P, Q + + QPRODUCT%W = P%W*Q%W - P%X*Q%X - P%Y*Q%Y - P%Z*Q%Z + QPRODUCT%X = P%W*Q%X + P%X*Q%W + P%Y*Q%Z - P%Z*Q%Y + QPRODUCT%Y = P%W*Q%Y - P%X*Q%Z + P%Y*Q%W + P%Z*Q%X + QPRODUCT%Z = P%W*Q%Z + P%X*Q%Y - P%Y*Q%X + P%Z*Q%W + + END FUNCTION QPRODUCT + + ! --------- general angle and euler angle stuff ------------- + SUBROUTINE ROTANGAX(ANG,AX,INVEC,OUTVEC,CALCROTMAT,ROTMAT) + ! rotate a 3D vector by angle ANG around axis AX + ! if CALCROTMAT is true, recalculate the rotation matrix + ! otherwise use the provided one + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: ANG, AX(3), INVEC(3) + DOUBLE PRECISION, INTENT(OUT) :: OUTVEC(3) + DOUBLE PRECISION, INTENT(INOUT) :: ROTMAT(3,3) + LOGICAL, INTENT(IN) :: CALCROTMAT + DOUBLE PRECISION :: CT,ST,CT1 + INTEGER :: I + + IF (CALCROTMAT) THEN + CT = COS(ANG); ST = SIN(ANG) + CT1 = 1-CT + ROTMAT(1,:) = (/CT + AX(1)**2*CT1, AX(1)*AX(2)*CT1-AX(3)*ST, AX(1)*AX(3)*CT1+AX(2)*ST/) + ROTMAT(2,:) = (/AX(2)*AX(1)*CT1+AX(3)*ST,CT+AX(2)**2*CT1,AX(2)*AX(3)*CT1-AX(1)*ST/) + ROTMAT(3,:) = (/AX(3)*AX(1)*CT1-AX(2)*ST,AX(3)*AX(2)*CT1+AX(1)*ST, CT+AX(3)**2*CT1/) + ENDIF + + DO I = 1,3 + OUTVEC(I) = DOT_PRODUCT(ROTMAT(I,:),INVEC) + ENDDO + END SUBROUTINE ROTANGAX + + SUBROUTINE EUL2ROTMAT(EUL,ROTMAT,DMAT) + ! get the rotation matrix corresponding to various euler angles + ! and the appropriate derivatives if DMAT is present + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: EUL(3) + DOUBLE PRECISION, INTENT(OUT) :: ROTMAT(3,3) + DOUBLE PRECISION, INTENT(OUT), OPTIONAL :: DMAT(3,3,3) + DOUBLE PRECISION :: CA,SA,CB,SB,CG,SG + + CA = COS(EUL(1)); SA = SIN(EUL(1)) + CB = COS(EUL(2)); SB = SIN(EUL(2)) + CG = COS(EUL(3)); SG = SIN(EUL(3)) + + ROTMAT(1,:) = (/CA*CG-SA*CB*SG, -CA*SG-SA*CB*CG, SB*SA/) + ROTMAT(2,:) = (/SA*CG+CA*CB*SG,-SA*SG+CA*CB*CG,-SB*CA/) + ROTMAT(3,:) = (/SB*SG,SB*CG,CB/) + + IF (PRESENT(DMAT)) THEN + dMAT(1,:,1) = (/-SA*CG-CA*CB*SG,SA*SG-CA*CB*CG,SB*CA/) + dMAT(2,:,1) = (/CA*CG-SA*CB*SG,-CA*SG-SA*CB*CG,SB*SA/) + dMAT(3,:,1) = 0D0 + + dMAT(1,:,2) = (/SA*SB*SG,SA*SB*CG,CB*SA/) + dMAT(2,:,2) = (/-CA*SB*SG,-CA*SB*CG,-CB*CA/) + dMAT(3,:,2) = (/CB*SG,CB*CG,-SB/) + + dMAT(1,:,3) = (/-CA*SG-SA*CB*CG,-CA*CG+SA*CB*SG,0D0/) + dMAT(2,:,3) = (/-SA*SG+CA*CB*CG,-SA*CG-CA*CB*SG,0D0/) + dMAT(3,:,3) = (/SB*CG,-SB*SG,0D0/) + ENDIF + END SUBROUTINE EUL2ROTMAT + + SUBROUTINE GETANGLE(IJ,KJ,CST,dCTdIJ,dCTdKJ) + ! get the angle between three points (I-J-K) + ! and, optionally, the derivative of that angle + ! actually this returns the COSINE of the angle and its derivative + ! IJ = I-J; KJ = K-J + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: IJ(3),KJ(3) + DOUBLE PRECISION, INTENT(OUT) :: CST + DOUBLE PRECISION, INTENT(OUT), OPTIONAL :: dCTdIJ(3), dCTdKJ(3) + + DOUBLE PRECISION :: DXI, DYI, DZI, DXJ, DYJ, DZJ + DOUBLE PRECISION :: RI2, RJ2, RI, RJ, RIR, RJR + DOUBLE PRECISION :: DXIR,DYIR, DZIR,DXJR,DYJR,DZJR + + DXI=IJ(1); DYI = IJ(2); DZI = IJ(3) + DXJ = KJ(1); DYJ = KJ(2); DZJ = KJ(3) + + RI2=DXI*DXI+DYI*DYI+DZI*DZI + RJ2=DXJ*DXJ+DYJ*DYJ+DZJ*DZJ + RI=SQRT(RI2) + RJ=SQRT(RJ2) + RIR=1/RI + RJR=1/RJ + DXIR=DXI*RIR + DYIR=DYI*RIR + DZIR=DZI*RIR + DXJR=DXJ*RJR + DYJR=DYJ*RJR + DZJR=DZJ*RJR + CST=DXIR*DXJR+DYIR*DYJR+DZIR*DZJR + IF (PRESENT(DCTDIJ)) THEN + dCTdIJ(1)=-(DXIR*CST-DXJR)*RIR + dCTdIJ(2)=-(DYIR*CST-DYJR)*RIR + dCTdIJ(3)=-(DZIR*CST-DZJR)*RIR + ENDIF + IF (PRESENT(DCTDKJ)) THEN + dCTdKJ(1)=-(DXJR*CST-DXIR)*RJR + dCTdKJ(2)=-(DYJR*CST-DYIR)*RJR + dCTdKJ(3)=-(DZJR*CST-DZIR)*RJR + ENDIF + + END SUBROUTINE GETANGLE + + SUBROUTINE GETDIHEDRAL(IJ,JK,LK, PHI, dPdIJ, dPdJK, dPdLK) + ! dihedral angle for 4 atoms I, J, K, L bound in order + ! IJ = I-J; JK = J-K; LK = L-K + ! find the dihedral torsion angle; return it in PHI + ! Also return all derivatives: dP/dIJx, dP/dIJy, dP/dIJz in triplet dPdIJ + ! same with dPdJK, dPdLK + IMPLICIT NONE + DOUBLE PRECISION, INTENT(IN) :: IJ(3), JK(3), LK(3) + DOUBLE PRECISION, INTENT(OUT) :: PHI + DOUBLE PRECISION, INTENT(OUT), OPTIONAL :: dPdIJ(3), dPdJK(3), dPdLK(3) + DOUBLE PRECISION :: DPDJ(3),DPDI(3),DPDK(3),DPDL(3) + DOUBLE PRECISION :: FX, FY, FZ, GX, GY, GZ, HX, HY, HZ + DOUBLE PRECISION :: AX, AY, AZ, BX, BY, Bz + DOUBLE PRECISION :: RF, RG, RH, RF2, RG2, RH2, RFR, RGR, RHR + DOUBLE PRECISION :: CSTTWO, SNTTWO2, CSTTHREE, SNTTHREE2, SNTTWO2R, SNTTHREE2R + DOUBLE PRECISION :: RA2, RB2, RA2R, RB2R, RABR, CP + DOUBLE PRECISION :: MYTX, MYTY, MYTZ, MYSCALAR + DOUBLE PRECISION :: DUMMY, DUMMY2 + DOUBLE PRECISION :: B1(3), B2(3), B3(3), B12(3), B23(3) + LOGICAL :: NOCOOR = .FALSE. + + + FX=IJ(1) + FY=IJ(2) + FZ=IJ(3) + GX=JK(1) + GY=JK(2) + GZ=JK(3) + HX=LK(1) + HY=LK(2) + HZ=LK(3) + ! A=F x G, B=H x G + AX=FY*GZ-FZ*GY + AY=FZ*GX-FX*GZ + AZ=FX*GY-FY*GX + BX=HY*GZ-HZ*GY + BY=HZ*GX-HX*GZ + BZ=HX*GY-HY*GX + ! RG=|G|, RGR=1/|G| + RG2=GX*GX+GY*GY+GZ*GZ + RG=SQRT(RG2) + RGR=1/RG + ! dae for use in evaluating B-matrix + RF2=FX*FX+FY*FY+FZ*FZ + RF=SQRT(RF2) + RFR=1/RF + RH2=HX*HX+HY*HY+HZ*HZ + RH=SQRT(RH2) + RHR=1/RH + + + CSTTWO=-(FX*GX+FY*GY+FZ*GZ)*RFR*RGR + SNTTWO2=1-CSTTWO*CSTTWO + SNTTWO2R=1/SNTTWO2 + CSTTHREE=(HX*GX+HY*GY+HZ*GZ)*RHR*RGR + SNTTHREE2=1-CSTTHREE*CSTTHREE + SNTTHREE2R=1/SNTTHREE2 + + RA2=AX*AX+AY*AY+AZ*AZ + RB2=BX*BX+BY*BY+BZ*BZ + RA2R=1/RA2 + RB2R=1/RB2 + RABR=SQRT(RA2R*RB2R) + + PHI = ATAN2(-RG*(FX*BX+FY*BY+FZ*BZ),AX*BX+AY*BY+AZ*BZ) + + + IF (PRESENT(DPDIJ).OR.PRESENT(DPDJK).OR.PRESENT(DPDLK)) THEN + DUMMY=RFR*RFR*RGR*SNTTWO2R + dPdI = (/-AX*DUMMY, -AY*DUMMY, -AZ*DUMMY/) + DUMMY=RFR*RFR*RGR*RGR*SNTTWO2R*(RG-RF*CSTTWO) + DUMMY2=RHR*RGR*RGR*SNTTHREE2R*CSTTHREE + dPdJ = (/AX*DUMMY-BX*DUMMY2, AY*DUMMY-BY*DUMMY2, AZ*DUMMY-BZ*DUMMY2/) + DUMMY=RHR*RHR*RGR*SNTTHREE2R + dPdL = (/BX*DUMMY,BY*DUMMY,BZ*DUMMY/) + ENDIF + IF (PRESENT(DPDIJ)) DPDIJ = DPDI + IF (PRESENT(DPDLK)) DPDLK = DPDL + IF (PRESENT(DPDJK)) DPDJK = DPDI + DPDJ + + + END SUBROUTINE GETDIHEDRAL + + DOUBLE PRECISION FUNCTION ANGLE0(ANGLE) + ! convert an angle to one between +/- pi + ! (so keeping it as close as possible to zero) + IMPLICIT NONE + DOUBLE PRECISION :: ANGLE + + ANGLE0 = ANGLE2PI(ANGLE) + IF (ANGLE0.GT.PI) THEN + ANGLE0 = ANGLE0 - 2*PI + ENDIF + END FUNCTION ANGLE0 + + DOUBLE PRECISION FUNCTION ANGLE2PI(ANGLE) + ! convert an angle to one between 0 and 2pi by adding or subtracting multiples of 2pi + IMPLICIT NONE + DOUBLE PRECISION :: ANGLE + INTEGER :: N2PI + + N2PI = INT(ANGLE/(2*PI)) + IF (ANGLE.LT.0) THEN + ANGLE2PI = ANGLE+(-N2PI+1)*2*PI + ELSE + ANGLE2PI = ANGLE - N2PI*2*PI + ENDIF + END FUNCTION ANGLE2PI + +END MODULE QUATUTIL diff --git a/BasicWLC/MISCcode/readkey.f90 b/BasicWLC/MISCcode/readkey.f90 new file mode 100644 index 00000000..8e76ecfb --- /dev/null +++ b/BasicWLC/MISCcode/readkey.f90 @@ -0,0 +1,581 @@ +SUBROUTINE READKEY + ! this subroutine reads in keywords from a parameter file + ! it sets the various global variables defined in KEYS module + ! name of the parameter file is param.* where * is a keyword argument + ! if no keyword argument is supplied, the default is just a file called param + ! The EXTRAPARAMFILES keyword will allow extra parameter files to be + ! read in as well + + USE KEYS + USE INPUTPARAMS, ONLY : READLINE, READA, READF, READI, READO + USE GENUTIL + + IMPLICIT NONE + + ! ---- stuff for inputing the parameter file in free format -------- + CHARACTER*100 :: ARG ! command line argument + INTEGER :: NUMARG ! number of command line arguments + INTEGER :: NITEMS ! number of items on the line in the parameter file + INTEGER :: PF ! input file unit + LOGICAL :: FILEEND=.FALSE. ! done reading file? + CHARACTER*100 :: WORD ! keyword + ! -------------- for reading multiple parameter files -------- + INTEGER, PARAMETER :: MAXNFILES = 10 + CHARACTER*100 :: PARAMFILES(MAXNFILES) + INTEGER :: NPARAMFILES, NPARAMREAD + ! ------ for initializing stuff + INTEGER :: TIMEVAL(8), SEED + !DOUBLE PRECISION :: ROTMAT(3,3) + ! ---------------- temporary variables --------------- + INTEGER :: DUMI, I, TMPI, DUMI1, DUMI2, DUMI3 + CHARACTER*100 :: DUMSTR + LOGICAL :: LDUM, TRACKDISTSET + + ! ------------------------ + ! set variable defaults + ! ------------------------ + ACTION = 'NONE' + RNGSEED = 0 + VERBOSE = .FALSE. + + ! geometry and energy parameters + SHEARABLE = .TRUE. + STRETCHABLE = .TRUE. + COUPLED = .TRUE. + LS = 0.1D0; + LP = 1; + EC = 0; + EPERP = 1D3; + EPAR = 1D3; + GAM = 1D0; + STARTNPT = 100; + MAXNPT = 100; + FORCE = 0D0 + FINITEXT = .FALSE. + FINITSHEAR = 1D-3 + NEDGESEG = 0 + EDGELS = 0.1D0 + EDGELP = 1; + EDGEGAM = 1; + EDGEEPAR = 1D3; + EDGEEPERP = 1D3; + EDGEEC = 0; + + ! input/output + OUTFILE = '*.out' + DUMPSNAPSHOTS = .FALSE. + SNAPSHOTEVERY = 1 + SNAPSHOTFILE = '*.snap.out' + RESTART = .FALSE. + RESTARTFILE = '*.snap.out' + APPENDSNAPSHOTS = .FALSE. + SKIPREAD=1 + STARTEQUIL = .FALSE. + EQUILSAMPLETYPE = 1 + + ! monte carlo + MCPRINTFREQ = 100 + MCTOTSTEPS = 1000 + MCINITSTEPS = 100 + MCSTATSTEPS = 100 + MCOUTPUTFREQ = 100 + + ADJUSTEVERY = 1000 + FACCTARGET = 0.5D0 + FACCTOL = 0.1D0 + ADJUSTSCL = 2D0 + DOREDISC = .FALSE. + DOLOCALMOVES = .FALSE. + OUTPUTBEADWEIGHT = .FALSE. + INTuWEIGHTNPT = 500 + INTRWEIGHTNPT = 50 + + ! brownian dynamics + DELTSCL = 1D-4 + FRICTR = 1D0 + FRICTU = 1D0 + FRICTPERLEN = .FALSE. + FRICTOB = 10D0 + RADOB = 1D0 + MODOB = 1D3 + BDSTEPS = 1000 + BDPRINTEVERY = 1 + BDPRINTLOG = .FALSE. + LOGRTERM = .FALSE. + FIXBEAD1 = .FALSE. + FIXBEADMID = .FALSE. + RUNGEKUTTA = 4 + STRESSFILE = '*.stress.out' + GAUSSIANCHAIN = .FALSE. + DOBROWN = .TRUE. + ! coefficient for the relaxation force in the bead-rod brownian dynamics + ! that keeps the segment length more or less constant + BRCRELAX = 0.1; + USEPSEUDOFORCE = .TRUE. + CONSTMOD = 1D4 + MU = 0D0 + ! tracking looping first passage times + TRACKLOOPING=.FALSE. + LOOPRAD = 0.1 + LOOPFILE= "*.loop.out" + + INITRANGE = 1D0 + + USESTERICS = .FALSE. + STERRAD = 1D0 + STERSKIP=1 + STERMOD = 1D3 + + MINSEGLEN = 0.1D0 + MAXSEGLEN = 5D0 + + ! groups of chains + PARAMFROMSNAPSHOT = .FALSE. + NCONNECT = 0 + NCHAIN = 1 + SQUARELATTICE = .FALSE. + NFORCE = 0 + FORCE = 0D0 + CONNECTIONS = 0 + CONNECTPOS = .TRUE. + CONNECTUVEC = .FALSE. + CONPOSMOD = 1D3 + CONUVECMOD = 1D3 + TRACKDISTSET = .FALSE. + TRACKDIST = 0 + FIXCONNECT = .FALSE. + NFIXBEAD = 0 + FIXBEAD = 0 + FIXBOUNDARY = .FALSE. + SETSHEAR = .FALSE. + SHEARGAMMA = 0D0 + DIAMONDLATTICE = .FALSE. + NDIAMOND = (/1,1/) + WIDTHDIAMOND = -1D0 + LENDIAMOND = 1 + STARTCOLLAPSE = .FALSE. + USEBDENERGY=.FALSE. + + RESTART = .FALSE. + RESTARTFILE = 'start.out' + SKIPREAD = 0 + + EQUILBEADROD = .FALSE. + STARTEQUILLP = 1D0 + + ! ------------------------- + ! Read in all parameter files, starting with the ones specified on command line + ! -------------------------- + + PF = 55 ! i/o unit number to be used for parameter files + + ! get input parameter files from command line + NPARAMFILES = 0 + NUMARG = COMMAND_ARGUMENT_COUNT() + IF (NUMARG==0) THEN + NPARAMFILES = 1 + PARAMFILES(1) = 'param' + ARG = '' + ELSE + DO I = 1,NUMARG + CALL GETARG(I, ARG) + NPARAMFILES = NPARAMFILES + 1 + WRITE(DUMSTR,'(A)') 'param.' //TRIM(ADJUSTL(ARG)) + PARAMFILES(NPARAMFILES) = DUMSTR + ENDDO + ! reset arg to its original value + IF (NUMARG.GT.1) CALL GETARG(1,ARG) + ENDIF + + NPARAMREAD = 0 ! keep track of how many files have been read + DO WHILE (NPARAMREAD.LT.NPARAMFILES) + NPARAMREAD = NPARAMREAD + 1 + + PRINT*, 'Reading parameter file: ', PARAMFILES(NPARAMREAD) + INQUIRE(FILE=PARAMFILES(NPARAMREAD),EXIST=LDUM) + IF (.NOT.LDUM) THEN + PRINT*, 'ERROR in READKEY: Parameter file ', TRIM(ADJUSTL(PARAMFILES(NPARAMREAD))), ' does not exist.' + STOP 1 + ENDIF + OPEN(UNIT=PF, FILE=PARAMFILES(NPARAMREAD), STATUS='OLD') + + ! read in the keywords one line at a time + DO + CALL READLINE(PF,FILEEND,NITEMS) + IF (FILEEND.and.nitems.eq.0) EXIT + + ! skip empty lines + IF (NITEMS.EQ.0) CYCLE + + ! Read in the keyword for this line + CALL READA(WORD,CASESET=1) + + ! Skip any empty lines or any comment lines + IF (WORD(1:1).EQ.'#') CYCLE + + SELECT CASE(WORD) ! pick which keyword + CASE('ACTION') + CALL READA(ACTION, CASESET=1) + CASE('ADJUSTRANGE') + CALL READI(ADJUSTEVERY) + IF (NITEMS.GT.2) CALL READF(FACCTARGET) + IF (NITEMS.GT.3) CALL READF(FACCTOL) + IF (NITEMS.GT.4) CALL READF(ADJUSTSCL) + CASE('BDSTEPS') + CALL READI(BDSTEPS) + IF (NITEMS.GT.2) CALL READF(BDPRINTEVERY) + IF (NITEMS.GT.3) CALL READO(BDPRINTLOG) + CASE('BRCRELAX') + CALL READF(BRCRELAX) + CASE('CONNECT') + NCONNECT = NCONNECT + 1 + IF (NCONNECT.GT.MAXNCONNECT) THEN + PRINT*, 'TOO MANY EXPLICIT CONNECTIONS. RAISE MAXNCONNECT' + STOP 1 + ENDIF + DO DUMI = 1,4 + CALL READI(CONNECTIONS(NCONNECT,DUMI)) + ENDDO + CASE('CONNECTMOD') + CALL READF(CONPOSMOD) + CALL READF(CONUVECMOD) + CASE('CONNECTTYPE') + CALL READO(CONNECTPOS) + CALL READO(CONNECTUVEC) + CASE('CONSTMOD') + CALL READF(CONSTMOD) + CASE('COUPLED') + CALL READO(COUPLED) + CASE('DELTSCL') + CALL READF(DELTSCL) + CASE('DIAMONDLATTICE') + DIAMONDLATTICE = .TRUE. + DO DUMI = 1,2 + CALL READI(NDIAMOND(DUMI)) + ENDDO + CALL READi(LENDIAMOND) + IF (NITEMS.GT.4) CALL READF(WIDTHDIAMOND) + CASE('DOLOCALMOVES') + DOLOCALMOVES = .TRUE. ! do single bead moves for 1-chain MC + CASE('EC') + CALL READF(EC) + CASE('EDGESEGS') + CALL READI(NEDGESEG) + CALL READF(EDGELS) + CALL READF(EDGELP) + CALL READF(EDGEGAM) + CALL READF(EDGEEPAR) + CALL READF(EDGEEPERP) + CALL READF(EDGEEC) + CASE('EPAR') + CALL READF(EPAR) + CASE('EPERP') + CALL READF(EPERP) + CASE('FINITEXT') + IF (NITEMS.GT.1) THEN + CALL READF(FINITSHEAR) + ENDIF + FINITEXT = .TRUE. + CASE('FIXBEAD') + NFIXBEAD = NFIXBEAD + 1 + IF (NFIXBEAD.GT.MAXFIXBEAD) THEN + PRINT*, 'ERROR: too many fixed bead lines' + STOP 1 + ENDIF + CALL READI(FIXBEAD(NFIXBEAD,1)) + IF (NITEMS.GT.2) THEN + CALL READI(FIXBEAD(NFIXBEAD,2)) + CALL READO(LDUM) + IF (LDUM) FIXBEAD(NFIXBEAD,3) = 1 + CALL READO(LDUM) + IF (LDUM) FIXBEAD(NFIXBEAD,4) = 1 + ELSE + FIXBEAD(NFIXBEAD,2) = 1 + ENDIF + CASE('FIXBEAD1') + FIXBEAD1 = .TRUE. + CASE('FIXBEADMID') + FIXBEADMID = .TRUE. + CASE('FIXBOUNDARY') + IF (NITEMS.GT.1) THEN + CALL READO(FIXBOUNDARY(1)) + CALL READO(FIXBOUNDARY(2)) + ENDIF + IF (NITEMS.GT.3) THEN + CALL READO(FIXBOUNDARY(3)) + CALL READO(FIXBOUNDARY(4)) + ENDIF + CASE('FIXCONNECT') + FIXCONNECT=.TRUE. + CASE('FORCE') + NFORCE = NFORCE + 1 + IF (NFORCE.GT.MAXNFORCE) THEN + PRINT*, 'TOO MANY FORCE! RAISE MAXNFORCE.' + stop 1 + ENDIF + CALL READI(FORCEBEAD(NFORCE,1)) + CALL READI(FORCEBEAD(NFORCE,2)) + DO DUMI = 1,3 + CALL READF(FORCE(NFORCE,DUMI)) + ENDDO + CASE('FRICT') + CALL READF(FRICTR) + CALL READF(FRICTU) + IF (NITEMS.GT.3) THEN + CALL READO(FRICTPERLEN) + ENDIF + CASE('GAM') + CALL READF(GAM) + CASE('GAUSSIANCHAIN') + GAUSSIANCHAIN = .TRUE. + CASE('INITRANGE') + DO DUMI = 1,4 + CALL READF(INITRANGE(DUMI)) + ENDDO + CASE('LOGRTERM') + LOGRTERM = .TRUE. + CASE('LOOPING') + TRACKLOOPING = .TRUE. + IF (NITEMS.GT.1) CALL READF(LOOPRAD) + IF (NITEMS.GT.2) CALL READA(LOOPFILE) + CASE('LP') + CALL READF(LP) + CASE('LS') + CALL READF(LS) + CASE('MCPRINTFREQ') + CALL READI(MCPRINTFREQ) + IF (NITEMS.GT.2) THEN + CALL READI(MCOUTPUTFREQ) + ELSE + MCOUTPUTFREQ = MCPRINTFREQ + ENDIF + CASE('MCSTEPS') + CALL READI(MCTOTSTEPS) + IF (NITEMS.GT.2) THEN + CALL READI(MCSTATSTEPS) + endif + IF (NITEMS.GT.3) THEN + CALL READI(MCINITSTEPS) + ENDIF + CASE('MU') + CALL READF(MU) + CASE('NCHAIN') + CALL READI(NCHAIN) + CASE('NOBROWN') + DOBROWN = .FALSE. + CASE('NPT') + ! starting number of points; maximal number + ! if not specified, assuming maximal number is the starting number + CALL READI(STARTNPT) + IF (NITEMS.GT.2) THEN + CALL READI(MAXNPT) + ELSE + MAXNPT = STARTNPT + ENDIF + CASE('OBSTACLE') + CALL READF(RADOB) + CALL READF(MODOB) + CALL READF(FRICTOB) + CASE('OUTFILE') + CALL READA(OUTFILE) + CASE('OUTPUTBEADWEIGHT') + ! output the partition function associated with each mobile bead + ! integrating over R and U vecs separately + OUTPUTBEADWEIGHT = .TRUE. + IF (NITEMS.GT.1) THEN + ! number of integration points in each dim when integrating over u vector + CALL READI(INTUWEIGHTNPT) + ENDIF + IF (NITEMS.GT.2) THEN + CALL READI(INTRWEIGHTNPT) + ENDIF + CASE('PARAMFROMSNAPSHOT') + IF (NITEMS.GT.1) THEN + CALL READO(PARAMFROMSNAPSHOT) + ELSE + PARAMFROMSNAPSHOT = .TRUE. + ENDIF + CASE('REDISCRETIZE') + DOREDISC = .TRUE. + IF (NITEMS.GT.1) CALL READF(MINSEGLEN) + IF (NITEMS.GT.2) CALL READF(MAXSEGLEN) + CASE('RESTART') + RESTART = .TRUE. + IF (NITEMS.GT.1) CALL READA(RESTARTFILE) + IF (NITEMS.GT.2) CALL READI(SKIPREAD) + CASE('RNGSEED') + CALL READI(RNGSEED) + CASE('RUNGEKUTTA') + CALL READI(RUNGEKUTTA) + CASE('SETSHEAR') + SETSHEAR = .TRUE. + CALL READF(SHEARGAMMA) + CASE('SHEARABLE') + CALL READO(SHEARABLE) + CASE('SNAPSHOTS') + DUMPSNAPSHOTS = .TRUE. + IF (NITEMS.GT.1) CALL READI(SNAPSHOTEVERY) + IF (NITEMS.GT.2) CALL READA(SNAPSHOTFILE) + IF (NITEMS.GT.3) CALL READO(APPENDSNAPSHOTS) + CASE('STARTEQUIL') + ! start with properly sampled equilibrium conformations + STARTEQUIL = .TRUE. + IF (NITEMS.GT.1) CALL READI(EQUILSAMPLETYPE) + IF (NITEMS.GT.2) THEN + EQUILBEADROD = .TRUE. + CALL READF(STARTEQUILLP) + ENDIF + CASE('SQUARELATTICE') + SQUARELATTICE = .TRUE. + CASE('STARTCOLLAPSE') + STARTCOLLAPSE = .TRUE. + CASE('STERICS') + USESTERICS = .TRUE. + CALL READF(STERRAD) + IF (NITEMS.GT.2) CALL READI(STERSKIP) + IF (NITEMS.GT.3) CALL READF(STERMOD) + CASE('STRESSFILE') + CALL READA(STRESSFILE) + CASE('STRETCHABLE') + CALL READO(STRETCHABLE) + CASE('TRACKDIST') + TRACKDISTSET = .TRUE. + DO DUMI = 1,4 + CALL READI(TRACKDIST(DUMI)) + ENDDO + CASE('USEBDENERGY') + USEBDENERGY = .TRUE. ! use BD energy for MC calculations + CASE('USEPSEUDOFORCE') + ! use pseudo-potential force for bead-rod BD simulations? + CALL READO(USEPSEUDOFORCE) + CASE('VERBOSE') + CALL READO(VERBOSE) + CASE DEFAULT + print*, 'ERROR: unidentified keyword ', TRIM(WORD), " Will ignore." + END SELECT + ENDDO + CLOSE(PF) + ENDDO + + ! ----- set some more defaults ----- + IF (.NOT.TRACKDISTSET) THEN + TRACKDIST = (/1,1,STARTNPT,1/) + ENDIF + + ! ----------------- + ! check validity of some values, raise errors or adjust as necessary + ! ----------------- + + IF (STARTNPT.LE.0.OR.MAXNPT.LT.STARTNPT) THEN + PRINT*, 'ERROR IN NPT VALUES',STARTNPT,MAXNPT + STOP 1 + ENDIF + IF (EPERP.LT.0) THEN + PRINT*, 'ERROR IN EPERP VALUE', EPERP + STOP 1 + ENDIF + IF (EPAR.LT.0) THEN + PRINT*, 'ERROR IN EPAR VALUE', EPAR + STOP 1 + ENDIF + IF (LS.LT.0) THEN + PRINT*, 'ERROR IN LS VALUE', LS + STOP 1 + ENDIF + IF (LP.LT.0) THEN + PRINT*, 'ERROR IN LP VALUE', LP + STOP 1 + ENDIF + + IF (DIAMONDLATTICE) THEN + ! reset number of chains and length of chains based on diamond lattice + NCHAIN = 2*(NDIAMOND(1)+NDIAMOND(2)-1) + MAXNPT = 2*MINVAL(NDIAMOND)*LENDIAMOND + 1 + IF (WIDTHDIAMOND.LT.0) THEN + WIDTHDIAMOND = GAM*LS*LENDIAMOND/SQRT(2D0)*2 + ENDIF + PRINT*, 'Recalculating nchain and maxnpt for diamond lattice:', NCHAIN, MAXNPT, WIDTHDIAMOND + ENDIF + + IF (TRACKDIST(1).LE.0.OR.TRACKDIST(1).GT.MAXNPT& + & .OR.TRACKDIST(3).LE.0.OR.TRACKDIST(3).GT.MAXNPT& + & .OR.TRACKDIST(2).LE.0.OR.TRACKDIST(2).GT.NCHAIN & + & .OR.TRACKDIST(4).LE.0.OR.TRACKDIST(4).GT.NCHAIN) THEN + PRINT*, 'ERROR: BAD TRACKDIST', TRACKDIST + STOP 1 + ENDIF + + DO DUMI = 1,NFORCE + IF (FORCEBEAD(DUMI,1).LE.0.OR.FORCEBEAD(DUMI,1).GT.MAXNPT & + & .OR.FORCEBEAD(DUMI,2).LE.0.OR.FORCEBEAD(DUMI,2).GT.NCHAIN) THEN + PRINT*, 'ERROR: BAD FORCE', FORCEBEAD(DUMI,:) + STOP 1 + ENDIF + ENDDO + + ! ----------- fix file names ----------- + CALL REPLACESUBSTR(OUTFILE,'*',TRIM(ADJUSTL(ARG))) + CALL REPLACESUBSTR(SNAPSHOTFILE,'*',TRIM(ADJUSTL(ARG))) + CALL REPLACESUBSTR(RESTARTFILE,'*',TRIM(ADJUSTL(ARG))) + CALL REPLACESUBSTR(STRESSFILE,'*',TRIM(ADJUSTL(ARG))) + CALL REPLACESUBSTR(LOOPFILE,'*',TRIM(ADJUSTL(ARG))) + ! --------------------------- + + ! Initiate random number generator + IF (RNGSEED.EQ.0) THEN + ! use the current time of day in milliseconds + CALL DATE_AND_TIME(VALUES=TIMEVAL) + SEED = TIMEVAL(5)*3600*1000 + TIMEVAL(6)*60*1000 + TIMEVAL(7)*1000 + TIMEVAL(8) + ELSEIF (RNGSEED.EQ.-1) THEN + ! use the last 5 characters in the command-line argument + SEED = STRING2NUM(TRIM(ADJUSTL(ARG))) + ELSEIF (RNGSEED.EQ.-2) THEN + ! use the last 4 characters in the command-line argument + ! and additionally the millisecond time + CALL DATE_AND_TIME(VALUES=TIMEVAL) + SEED = STRING2NUM(TRIM(ADJUSTL(ARG)),TIMEVAL(8)) + ELSE + ! use this seed directly + SEED = RNGSEED + ENDIF + + print*, 'Initiating Mersenne twister random number generator with seed:', SEED + CALL SGRND(SEED) + + print*, '------------Parameter values : -------------------' + print*, 'ACTION: ', TRIM(ADJUSTL(ACTION)) + print*, 'Output file: ', TRIM(OUTFILE) + IF (DUMPSNAPSHOTS) THEN + PRINT*, 'Dumping snapshot every', SNAPSHOTEVERY,'steps. In file:', TRIM(ADJUSTL(SNAPSHOTFILE)) + ENDIF + IF (RESTART) THEN + PRINT*, 'Restarting from file:', trim(adjustl(RESTARTFILE)) + ENDIF + print*, 'Number of chains:', NCHAIN + print*, 'STARTNPT, MAXNPT, LS:', STARTNPT, MAXNPT,LS + PRINT*, 'LP, GAM, EPAR, EPERP, EC:', LP, GAM, EPAR, EPERP, EC + PRINT*, 'FINITE EXTENSION?:', FINITEXT, FINITSHEAR + PRINT*, 'FRICTION COEFFICIENTS:', FRICTR, FRICTU + PRINT*, 'OBSTACLE:', RADOB,MODOB,FRICTOB + PRINT*, 'CONSTRAINT, STERIC MODULUS, mu:', CONSTMOD, STERMOD, MU + IF (USESTERICS) THEN + PRINT*, 'Using sterics, with radius:', STERRAD + ENDIF + PRINT*, 'NUMBER OF CONNECTIONS:', NCONNECT, SQUARELATTICE + PRINT*, 'FIXED CONNECTIONS?:', FIXCONNECT + print*, 'Tracking distance btwn points:', TRACKDIST + IF (NFIXBEAD.GT.0) THEN + PRINT*, 'FIXED BEADS:' + DO DUMI = 1,NFIXBEAD + PRINT*, FIXBEAD(DUMI,:) + ENDDO + ENDIF + IF (ANY(FIXBOUNDARY)) PRINT*, 'FIXING BOUNDARIES.', FIXBOUNDARY + IF (GAUSSIANCHAIN) PRINT*, 'Treating chain as a plain gaussian with stretch modulus EPAR' + IF (STARTEQUIL) PRINT*, 'Starting from equilibrated configurations.' + IF (NEDGESEG.GT.0) PRINT*, 'For ', NEDGESEG, ' edge segments parameters are:', & + & EDGELS, EDGELP, EDGEGAM, EDGEEPAR, EDGEEPERP, EDGEEC + print*, '----------------------------------------------------' + + +END SUBROUTINE READKEY diff --git a/BasicWLC/SIMcode/debugging.f90 b/BasicWLC/SIMcode/debugging.f90 new file mode 100644 index 00000000..d9d696dc --- /dev/null +++ b/BasicWLC/SIMcode/debugging.f90 @@ -0,0 +1,39 @@ +logical function isanynan(arr) + use globals, only : dp + + implicit none + + real(dp), dimension(:,:) :: arr + integer, dimension(2) :: shapes + integer :: i, j + + shapes = shape(arr) + isanynan = .false. + do i = 1, shapes(1) + do j = 1, shapes(2) + if (isnan(arr(i,j))) then + isanynan = .true. + return + endif + enddo + enddo +endfunction + +logical function b_any(arr) + implicit none + logical :: arr(:,:) + b_any = any(arr) +end function + ! integer :: r + + ! r = rank(arr) + ! isanynan = isanynan_helper(arr, r) +! end function + +! logical isanynan_helper(arr, rank) + ! real(REAL64), intent(in), dimension(*) :: arr + ! integer, intent(in) :: rank + ! integer, dimension(rank) :: sizes + + ! sizes = shape(arr) + ! do i=1, diff --git a/BasicWLC/SIMcode/decim.f90 b/BasicWLC/SIMcode/decim.f90 new file mode 100644 index 00000000..61782ef6 --- /dev/null +++ b/BasicWLC/SIMcode/decim.f90 @@ -0,0 +1,153 @@ +!---------------------------------------------------------------* + + SUBROUTINE decim(R,U,NT,N,NP,PARA,DT) + + PARAMETER (PI=3.141593) + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION RT(NT,3) ! Bead positions + DOUBLE PRECISION UT(NT,3) ! Tangent vectors + DOUBLE PRECISION TTOT ! Time of BD simulation + INTEGER N,NP,NT ! Number of beads + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION DEL + DOUBLE PRECISION PVEC(60,8) + INTEGER IND,CRS + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + DOUBLE PRECISION XIR,XIU + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION LHC ! Length of HC int + DOUBLE PRECISION VHC ! HC strength + DOUBLE PRECISION M + DOUBLE PRECISION DT + INTEGER I,J,IP + DOUBLE PRECISION L,LP + +! Reset the positions and orientations + + IND=1 + do 10 IP=1,NP + I=1 + J=1 + do while (I.LE.N) + RT(IND,1)=R(I+N*(IP-1),1) + RT(IND,2)=R(I+N*(IP-1),2) + RT(IND,3)=R(I+N*(IP-1),3) + UT(IND,1)=U(I+N*(IP-1),1) + UT(IND,2)=U(I+N*(IP-1),2) + UT(IND,3)=U(I+N*(IP-1),3) + I=I+2 + J=J+1 + IND=IND+1 + enddo + 10 CONTINUE + N=J-1 + + do 20 I=1,NP + do 30 J=1,N + IND=J+N*(I-1) + R(IND,1)=RT(IND,1) + R(IND,2)=RT(IND,2) + R(IND,3)=RT(IND,3) + U(IND,1)=UT(IND,1) + U(IND,2)=UT(IND,2) + U(IND,3)=UT(IND,3) + 30 continue + 20 continue + +! Load in the parameters for the simulation + + open (unit=5, file='input/input') + read (unit=5, fmt='(4(/))') + read (unit=5, fmt=*) LP + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) L + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) LBOX + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) LHC + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) VHC + close(5) + L=L/LP + DEL=L/(N-1.) + +! Load the tabulated parameters + + OPEN (UNIT=5,FILE='input/dssWLCparams',STATUS='OLD') + DO 40 I=1,60 + READ(5,*) PVEC(I,1),PVEC(I,2),PVEC(I,3),PVEC(I,4),PVEC(I,5),PVEC(I,6),PVEC(I,7),PVEC(I,8) + 40 CONTINUE + CLOSE(5) + + if (DEL.LT.PVEC(1,1)) then + DEL=PVEC(1,1) + endif + if (DEL.GT.PVEC(60,1)) then + DEL=PVEC(60,1) + endif + + CRS=0 + IND=1 + do while (CRS.EQ.0) + if (DEL.LE.PVEC(IND,1)) then + CRS=1 + else + IND=IND+1 + endif + enddo + + I=2 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + EB=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=3 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + GAM=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=4 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + EPAR=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=5 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + EPERP=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=6 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + ETA=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=7 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + XIU=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + +! I=8 +! M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) +! DT=XIU*(M*(DEL-PVEC(IND,1))+PVEC(IND,I)) + + EB=EB/DEL + EPAR=EPAR/DEL + EPERP=EPERP/DEL + GAM=DEL*GAM + + XIU=XIU*L/N + XIR=L/N + DT=0.5*XIU/(EPERP*GAM**2.) + + PARA(1)=EB + PARA(2)=EPAR + PARA(3)=EPERP + PARA(4)=GAM + PARA(5)=ETA + PARA(6)=XIR + PARA(7)=XIU + PARA(8)=LBOX + PARA(9)=LHC + PARA(10)=VHC + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/SIMcode/energy_elas.f90 b/BasicWLC/SIMcode/energy_elas.f90 new file mode 100644 index 00000000..dc5c2f24 --- /dev/null +++ b/BasicWLC/SIMcode/energy_elas.f90 @@ -0,0 +1,78 @@ +!---------------------------------------------------------------* + +! +! This subroutine calculates the elastic forces for a wormlike +! chain with a stretching potential. The stretch and bend +! moduli are fed along with the bead positions. +! +! Andrew Spakowitz +! Written 9-1-04 + + SUBROUTINE energy_elas(EELAS,R,U,NT,N,NP,PARA) + + DOUBLE PRECISION EELAS(3) ! Elastic force + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION B(NT) ! Tangent vectors + DOUBLE PRECISION UR(NT,3) ! Tangent vectors + DOUBLE PRECISION KAP,EPS ! Elastic props + DOUBLE PRECISION L0 ! Bead separation + DOUBLE PRECISION FCOM(3) ! Compress force + DOUBLE PRECISION FBEND(3) ! Bend force + INTEGER I,J,IB ! Index holders + INTEGER N,NT,NP ! Number of bead + +! Polymer properties + + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + +! Variables for force and torque calculations + + DOUBLE PRECISION DR(3),DRPAR,DRPERP(3) + DOUBLE PRECISION FI(3),TI(3) + DOUBLE PRECISION U1U2,GI(3),DOTGU,HI(3) + +! Calculate the forces and torques + + EB=PARA(1) + EPAR=PARA(2) + EPERP=PARA(3) + GAM=PARA(4) + ETA=PARA(5) + + EELAS(1)=0. + EELAS(2)=0. + EELAS(3)=0. + IB=1 + DO 30 I=1,NP + DO 40 J=1,(N-1) + DR(1)=R(IB+1,1)-R(IB,1) + DR(2)=R(IB+1,2)-R(IB,2) + DR(3)=R(IB+1,3)-R(IB,3) + DRPAR=DR(1)*U(IB,1)+DR(2)*U(IB,2)+DR(3)*U(IB,3) + + DRPERP(1)=DR(1)-DRPAR*U(IB,1) + DRPERP(2)=DR(2)-DRPAR*U(IB,2) + DRPERP(3)=DR(3)-DRPAR*U(IB,3) + U1U2=U(IB,1)*U(IB+1,1)+U(IB,2)*U(IB+1,2)+U(IB,3)*U(IB+1,3) + + GI(1)=(U(IB+1,1)-U(IB,1)-ETA*DRPERP(1)) + GI(2)=(U(IB+1,2)-U(IB,2)-ETA*DRPERP(2)) + GI(3)=(U(IB+1,3)-U(IB,3)-ETA*DRPERP(3)) + + EELAS(1)=EELAS(1)+0.5*EB*(GI(1)**2.+GI(2)**2.+GI(3)**2.) + EELAS(2)=EELAS(2)+0.5*EPAR*(DRPAR-GAM)**2. + EELAS(3)=EELAS(3)+0.5*EPERP*(DRPERP(1)**2.+DRPERP(2)**2.+DRPERP(3)**2.) + + IB=IB+1 + 40 CONTINUE + IB=IB+1 + 30 CONTINUE + + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/SIMcode/energy_ponp.f90 b/BasicWLC/SIMcode/energy_ponp.f90 new file mode 100644 index 00000000..8f58a4b9 --- /dev/null +++ b/BasicWLC/SIMcode/energy_ponp.f90 @@ -0,0 +1,147 @@ +!---------------------------------------------------------------* + +! +! This subroutine calculates the self-interaction of a DNA-like +! molecule as a linear chain with charges along the centerline. +! Within the program is specified the Bjerrum length, the +! Debye length, and the length of hard-core repulsion. Exactly +! as given in AJSclamp4-16-04 and elsewhere. +! +! Corrections to force magnitude made 6-3-04. +! +! Andrew Spakowitz +! Written 1-31-05 + + SUBROUTINE energy_ponp(EPONP,R,NT,N,NP,PARA) + + DOUBLE PRECISION R(NT,3) ! Bead positions + INTEGER N,NT,NP ! Current number of beads + DOUBLE PRECISION EPONP ! Self-interaction force + DOUBLE PRECISION FMAG ! Mag of force + DOUBLE PRECISION RIJ ! Interbead dist + DOUBLE PRECISION EIJ(3) ! Interbead unit vector + INTEGER I, J ! Index holders + INTEGER SKIP ! Bead skip index + +! Variables for the calculation + + DOUBLE PRECISION U1(3),U2(3),U1U2 + DOUBLE PRECISION D1,D2 + DOUBLE PRECISION R12(3),D12,E12(3) + DOUBLE PRECISION S1,S2 + DOUBLE PRECISION GI(3) + INTEGER I1,J1,I2,J2 + INTEGER IB1,IB2 + +! Parameters in the simulation + + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION LHC ! HC length + DOUBLE PRECISION SIGP ! HC diameter + DOUBLE PRECISION VHC ! Potential strengths + DOUBLE PRECISION GAM + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION SUM + DOUBLE PRECISION DT + DOUBLE PRECISION XIR + + + EB=PARA(1) + EPAR=PARA(2) + EPERP=PARA(3) + GAM=PARA(4) + ETA=PARA(5) + XIR=PARA(6) + XIU=PARA(7) + LBOX=PARA(8) + LHC=PARA(9) + VHC=PARA(10) + + +! Calculate the self-interaction forces + + EPONP=0. + DO 30 I1=1,(NP-1) + DO 40 J1=1,(N-1) + IB1=J1+N*(I1-1) + DO 50 I2=(I1+1),NP + DO 60 J2=1,(N-1) + IB2=J2+N*(I2-1) + R12(1)=R(IB2,1)-R(IB1,1) + R12(2)=R(IB2,2)-R(IB1,2) + R12(3)=R(IB2,3)-R(IB1,3) + R12(1)=R12(1)-nint(R12(1)/LBOX)*LBOX + R12(2)=R12(2)-nint(R12(2)/LBOX)*LBOX + R12(3)=R12(3)-nint(R12(3)/LBOX)*LBOX + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + if (D12.GT.(3.*GAM)) then + goto 70 + endif + + U1(1)=R(IB1+1,1)-R(IB1,1) + U1(2)=R(IB1+1,2)-R(IB1,2) + U1(3)=R(IB1+1,3)-R(IB1,3) + D1=sqrt(U1(1)**2.+U1(2)**2.+U1(3)**2.) + U1(1)=U1(1)/D1 + U1(2)=U1(2)/D1 + U1(3)=U1(3)/D1 + + U2(1)=R(IB2+1,1)-R(IB2,1) + U2(2)=R(IB2+1,2)-R(IB2,2) + U2(3)=R(IB2+1,3)-R(IB2,3) + D2=sqrt(U2(1)**2.+U2(2)**2.+U2(3)**2.) + U2(1)=U2(1)/D2 + U2(2)=U2(2)/D2 + U2(3)=U2(3)/D2 + + U1U2=U1(1)*U2(1)+U1(2)*U2(2)+U1(3)*U2(3) + if (U1U2.EQ.1.) then + goto 70 + endif + + GI(1)=U1(1)-U1U2*U2(1) + GI(2)=U1(2)-U1U2*U2(2) + GI(3)=U1(3)-U1U2*U2(3) + + S1=(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S1.GT.D1.OR.S1.LT.0.) then + goto 70 + endif + + GI(1)=U2(1)-U1U2*U1(1) + GI(2)=U2(2)-U1U2*U1(2) + GI(3)=U2(3)-U1U2*U1(3) + + S2=-(R12(1)*GI(1)+R12(2)*GI(2)+R12(3)*GI(3))/(1.-U1U2**2.) + + if (S2.GT.D2.OR.S2.LT.0.) then + goto 70 + endif + + R12(1)=R12(1)+S2*U2(1)-S1*U1(1) + R12(2)=R12(2)+S2*U2(2)-S1*U1(2) + R12(3)=R12(3)+S2*U2(3)-S1*U1(3) + + D12=sqrt(R12(1)**2.+R12(2)**2.+R12(3)**2.) + + if (D12.GT.LHC) then + goto 70 + endif + + FMAG=VHC*((LHC/D12)**12.-2.*(LHC/D12)**6.+1.)/12. + + EPONP=EPONP+FMAG + + 70 CONTINUE + 60 CONTINUE + 50 CONTINUE + 40 CONTINUE + 30 CONTINUE + + RETURN + END + +!---------------------------------------------------------------* + diff --git a/BasicWLC/SIMcode/gasdev.f90 b/BasicWLC/SIMcode/gasdev.f90 new file mode 100644 index 00000000..6d59d249 --- /dev/null +++ b/BasicWLC/SIMcode/gasdev.f90 @@ -0,0 +1,24 @@ +FUNCTION gasdev(idum) + INTEGER idum + REAL gasdev + INTEGER iset + REAL fac,gset,rsq,v1,v2,ran2 + SAVE iset,gset + DATA iset/0/ + if (idum.lt.0) iset=0 + if (iset.eq.0) then +1 v1=2.*ran2(idum)-1. + v2=2.*ran2(idum)-1. + rsq=v1**2+v2**2 + if(rsq.ge.1..or.rsq.eq.0.)goto 1 + fac=sqrt(-2.*log(rsq)/rsq) + gset=v1*fac + gasdev=v2*fac + iset=1 + else + gasdev=gset + iset=0 + endif + return +END FUNCTION gasdev + diff --git a/BasicWLC/SIMcode/getpara.f90 b/BasicWLC/SIMcode/getpara.f90 new file mode 100644 index 00000000..0232d706 --- /dev/null +++ b/BasicWLC/SIMcode/getpara.f90 @@ -0,0 +1,151 @@ +! *---------------------------------------------------------------* +! +! subroutine getpara.f95 +! Setup the parameters for the simulation +! +! 1. Determine the simulation type +! 2. Evaluate the polymer elastic parameters +! 3. Determine the parameters for Brownian dynamics simulation +! +! Andrew Spakowitz +! 8/17/15 +! + + SUBROUTINE getpara(PARA,DT,SIMTYPE) + + PARAMETER (PI=3.141593) + + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION DEL + DOUBLE PRECISION PVEC(679,8) + INTEGER IND,CRS + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + DOUBLE PRECISION XIR,XIU + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION LHC ! Length of HC int + DOUBLE PRECISION REND ! Fixed end-to-end distance (dimensionless) + DOUBLE PRECISION VHC ! HC strength + DOUBLE PRECISION M + DOUBLE PRECISION DT + INTEGER I,N + DOUBLE PRECISION L,LP + INTEGER SIMTYPE ! Simulation method (WLC=1,SSWLC=2,GC=3) + +! Load in the parameters for the simulation + + open (unit=5, file='input/input') + read (unit=5, fmt='(4(/))') + read (unit=5, fmt=*) LP + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) L + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) LBOX + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) REND + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) VHC + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) N + close(5) + L=L/LP + LP=1.0d0 + DEL=L/(N-1.0d0) + REND=REND*L + +! Load the tabulated parameters + + OPEN (UNIT=5,FILE='input/dssWLCparams',STATUS='OLD') + DO 10 I=1,679 + READ(5,*) PVEC(I,1),PVEC(I,2),PVEC(I,3),PVEC(I,4),PVEC(I,5),PVEC(I,6),PVEC(I,7),PVEC(I,8) + 10 CONTINUE + CLOSE(5) + + +! Setup the parameters for WLC simulation + + if (DEL.LT.PVEC(1,1)) then + EB=LP/DEL + GAM=DEL + XIR=L/N + SIMTYPE=1 + endif + +! Setup the parameters for GC simulation + + if (DEL.GT.PVEC(679,1)) then + EPAR=1.5/(DEL*LP**2.) + GAM=0. + SIMTYPE=3 + XIR=L/N + endif + +! Setup the parameters for ssWLC simulation + + if (DEL.GE.PVEC(1,1).AND.DEL.LE.PVEC(679,1)) then + SIMTYPE=2 + + CRS=0 + IND=1 + do while (CRS.EQ.0) + if (DEL.LE.PVEC(IND,1)) then + CRS=1 + else + IND=IND+1 + endif + enddo + + I=2 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + EB=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=3 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + GAM=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=4 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + EPAR=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=5 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + EPERP=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=6 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + ETA=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + + I=7 + M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) + XIU=M*(DEL-PVEC(IND,1))+PVEC(IND,I) + +! I=8 +! M=(PVEC(IND,I)-PVEC(IND-1,I))/(PVEC(IND,1)-PVEC(IND-1,1)) +! DT=XIU*(M*(DEL-PVEC(IND,1))+PVEC(IND,I)) + + EB=EB/DEL + EPAR=EPAR/DEL + EPERP=EPERP/DEL + GAM=DEL*GAM + + XIU=XIU*L/N + XIR=L/N + DT=0.5*XIU/(EPERP*GAM**2.) + + endif + + PARA(1)=EB + PARA(2)=EPAR + PARA(3)=EPERP + PARA(4)=GAM + PARA(5)=ETA + PARA(6)=XIR + PARA(7)=XIU + PARA(8)=LBOX + PARA(9)=REND + PARA(10)=DEL + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/SIMcode/globals.f90 b/BasicWLC/SIMcode/globals.f90 new file mode 100644 index 00000000..9b39848c --- /dev/null +++ b/BasicWLC/SIMcode/globals.f90 @@ -0,0 +1,12 @@ +module globals + use, intrinsic :: iso_fortran_env + + implicit none + + private + public :: pi, dp + + integer, parameter :: dp = REAL64 + real(dp), parameter :: pi = 3.1415926535897931_dp + +endmodule diff --git a/BasicWLC/SIMcode/initcond.f90 b/BasicWLC/SIMcode/initcond.f90 new file mode 100644 index 00000000..29baaa1d --- /dev/null +++ b/BasicWLC/SIMcode/initcond.f90 @@ -0,0 +1,150 @@ +! ---------------------------------------------------------------* + +! +! subroutine initcond.f95 +! Set the initial conformation of the polymer chains +! from file or from random initialization. +! +! Andrew Spakowitz +! 8/17/15 + + SUBROUTINE initcond(R,U,NT,N,NP,IDUM,FRMFILE,PARA) + + use globals, only : dp + use mt19937, only : init_genrand ! , grnd + + PARAMETER (PI=3.141593) + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + INTEGER N,NP,NT ! Number of beads + DOUBLE PRECISION GAM ! Equil bead separation + DOUBLE PRECISION LBOX ! Box edge length + INTEGER I,J,IB ! Index Holders + REAL ran1 ! Random number generator + INTEGER FRMFILE ! Is conformation in file? + INTEGER INPUT ! Is input file set? + DOUBLE PRECISION RMIN + DOUBLE PRECISION R0(3) + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION ARG + +! Parameters for end constraint + + INTEGER IMID + DOUBLE PRECISION ALPHA + DOUBLE PRECISION REND + DOUBLE PRECISION DEL + +! Variables in the simulation + + DOUBLE PRECISION KAP,EPS ! Elastic properties + DOUBLE PRECISION XI ! Drag coefficients + +! Random number generator initiation + + integer IDUM + character*8 datedum + character*10 timedum + character*5 zonedum + integer seedvalues(8) + +! Setup the choice parameters + + INPUT=1 + +! Seed the random number generator off the computer clock + + call date_and_time(datedum,timedum,zonedum,seedvalues) + +! concatenate filename, time within mins, secs, millisecs to seed random number generator + + IDUM=-seedvalues(5)*1E7-seedvalues(6)*1E5-seedvalues(7)*1E3-seedvalues(8) + OPEN (UNIT = 47, FILE = 'data/mt19337_seed', STATUS = 'NEW') + WRITE(47,*) IDUM + CLOSE(47) + call init_genrand(IDUM) + +! Input the conformation if FRMFILE=1 + + if(FRMFILE.EQ.1)then + OPEN (UNIT = 5, FILE = 'input/initial/r', STATUS = 'OLD') + IB=1 + DO 10 I=1,NP + DO 20 J=1,N + READ(5,*) R(IB,1),R(IB,2),R(IB,3) + IB=IB+1 + 20 CONTINUE + 10 CONTINUE + CLOSE(5) + + OPEN (UNIT = 5, FILE = 'input/initial/u', STATUS = 'OLD') + IB=1 + DO 30 I=1,NP + DO 40 J=1,N + READ(5,*) U(IB,1),U(IB,2),U(IB,3) + IB=IB+1 + 40 CONTINUE + 30 CONTINUE + CLOSE(5) + + endif + +! Set the initial conformation to a straight chain if CHOICE=1 + + if(FRMFILE.EQ.0)then + +! Fix the initial condition + + if (INPUT.EQ.0) then + LBOX=10. + GAM=1. + else + GAM=PARA(4) + LBOX=PARA(8) + endif + +! The initial configuration is supposed to be two line segments, intersecting at +! an angle $\alpha$. The first line is layed along the x-axis with one end at +! $(0,0,0)$, and the other segment starts half the polymer's length along the +! x-axis, with the other end sitting in the $xy$-plane with $x>0$ and $y>0$. + REND=PARA(9) + DEL=PARA(10) + IMID=nint((N+1.)/2.) + ARG = ((REND/DEL)**2.-((N-IMID)**2.+(IMID-1)**2.))/(2.*(IMID-1.)*(N-IMID)) +! prevent numerical domain error in arccos + ARG = max(-1.0_dp, ARG) + ARG = min(1.0_dp, ARG) + ALPHA=acos(ARG) + + IB=1 + DO 50 I=1,NP +! R0(1)=grnd()*LBOX +! R0(2)=grnd()*LBOX +! R0(3)=grnd()*LBOX + DO 50 J=1,N + if (J.LE.IMID) then + R(IB,1)=DEL*(J-1.) + R(IB,2)=0 + R(IB,3)=0 + U(IB,1)=1. + U(IB,2)=0. + U(IB,3)=0. + else + R(IB,1)=DEL*(IMID-1.)+DEL*(J-IMID)*cos(ALPHA) + R(IB,2)=DEL*(J-IMID)*sin(ALPHA) + R(IB,3)=0 + U(IB,1)=cos(ALPHA) + U(IB,2)=sin(ALPHA) + U(IB,3)=0. + endif + IB=IB+1 + 60 CONTINUE + 50 CONTINUE + + endif + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/SIMcode/initial_methyl_profile.f90 b/BasicWLC/SIMcode/initial_methyl_profile.f90 new file mode 100644 index 00000000..7935c343 --- /dev/null +++ b/BasicWLC/SIMcode/initial_methyl_profile.f90 @@ -0,0 +1,18 @@ +subroutine initial_methyl_profile(nt,meth_status,nuc_site) + implicit none + integer, intent(in) :: nt + integer, intent(inout) :: meth_status(nt), nuc_site + integer :: i + + nuc_site = ceiling(real(nt/2.0)) + + do i = 1, nt + meth_status(i) = 1 + end do + + +end + + + + diff --git a/BasicWLC/SIMcode/r_to_erg.f90 b/BasicWLC/SIMcode/r_to_erg.f90 new file mode 100644 index 00000000..dea35702 --- /dev/null +++ b/BasicWLC/SIMcode/r_to_erg.f90 @@ -0,0 +1,76 @@ +!! ---------------------------------------------------------------* + +! Find the energetic terms from R + +! Revised 6-22-04 + + SUBROUTINE r_to_erg(R,NT,N,ECOM,EBEND) + + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(N-1,3) ! Tangent + DOUBLE PRECISION B(N-1) ! Bond length + INTEGER N,NT ! Number of beads + INTEGER I + DOUBLE PRECISION KAP,EPS ! DNA mat props + DOUBLE PRECISION L0 ! Equilibrium + ! bead separation + DOUBLE PRECISION DOT ! Dot product + +! Variables in the tube interaction + + DOUBLE PRECISION LHC ! Length of HC int + DOUBLE PRECISION VHC ! HC strength + DOUBLE PRECISION RAD ! Radius of int + DOUBLE PRECISION SIGP ! Poly diameter of int + DOUBLE PRECISION FORCE + +! Energy variables + + DOUBLE PRECISION ECOM ! Compression energy + DOUBLE PRECISION EBEND ! Bending energy + DOUBLE PRECISION EEX ! External energy + DOUBLE PRECISION EPONP ! Poly energy + +! Setup the properties + + open (unit=5, file='input/input') + read (unit=5, fmt='(4(/))') + read (unit=5, fmt=*) KAP + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) EPS + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) L0 + close(5) + +! Setup the necessary quantities + + DO 10 I=1,(N-1) + B(I)=sqrt((R(I+1,1)-R(I,1))**2.+(R(I+1,2)-R(I,2))**2.+(R(I+1,3)-R(I,3))**2.) + U(I,1)=(R(I+1,1)-R(I,1))/B(I) + U(I,2)=(R(I+1,2)-R(I,2))/B(I) + U(I,3)=(R(I+1,3)-R(I,3))/B(I) + 10 CONTINUE + + +! Calculate the energetic contributions + + ECOM=0. + DO 30 I=1,(N-1) + ECOM=ECOM+(B(I)-L0)**2. + 30 CONTINUE + ECOM=0.5*KAP*ECOM + + EBEND=0. + DO 40 I=1,(N-2) + DOT=U(I+1,1)*U(I,1)+U(I+1,2)*U(I,2)+U(I+1,3)*U(I,3) + EBEND=EBEND+1.-DOT + 40 CONTINUE + EBEND=EPS*EBEND + +! call energy_ex(EEX,R,N,LHC,VHC,RAD) +! call energy_ponp(EPONP,R,N,LB,LHC,VHC,SIGP) + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/SIMcode/ran1.f90 b/BasicWLC/SIMcode/ran1.f90 new file mode 100644 index 00000000..ab5ce262 --- /dev/null +++ b/BasicWLC/SIMcode/ran1.f90 @@ -0,0 +1,30 @@ +! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! ²ú Éú(0,1) ¾ùÔÈ·Ö²¼Ëæ»úÊý×Ó³ÌÐò +! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + function ran1(idum) + integer idum,ia,im,iq,ir,ntab,ndiv + real ran1,am,eps,rnmx + parameter(ia=16807,im=2147483647,am=1./im,iq=127773,ir=2836,& + ntab=32,ndiv=1+(im-1)/ntab,eps=1.2e-7,rnmx=1.-eps) + integer j,k,iv(ntab),iy + save iv,iy + data iv/ntab*0/,iy/0/ + if (idum.le.0.or.iy.eq.0) then + idum=max(-idum,1) + do j=ntab+8,1,-1 + k=idum/iq + idum=ia*(idum-k*iq)-ir*k + if (idum.lt.0) idum=idum+im + if (j.le.ntab) iv(j)=idum + end do + iy=iv(1) + end if + k=idum/iq + idum=ia*(idum-k*iq)-ir*k + if (idum.lt.0) idum=idum+im + j=1+iy/ndiv + iy=iv(j) + iv(j)=idum + ran1=min(am*iy,rnmx) + end +! ----------------------------------------------------------------------- \ No newline at end of file diff --git a/BasicWLC/SIMcode/ran2.f90 b/BasicWLC/SIMcode/ran2.f90 new file mode 100644 index 00000000..6c86405a --- /dev/null +++ b/BasicWLC/SIMcode/ran2.f90 @@ -0,0 +1,35 @@ + + +FUNCTION RAN2(idum) + INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV + REAL ran2,AM,EPS,RNMX + PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1,IMM1=IM1-1, & + IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211,IR2=3791, & + NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS) + INTEGER idum2,j,k,iv(NTAB),iy + SAVE iv,iy,idum2 + DATA idum2/123456789/, iv/NTAB*0/, iy/0/ + if (idum.le.0) then + idum=max(-idum,1) + idum2=idum + do j=NTAB+8,1,-1 + k=idum/IQ1 + idum=IA1*(idum-k*IQ1)-k*IR1 + if (idum.lt.0) idum=idum+IM1 + if (j.le.NTAB) iv(j)=idum + end do + iy=iv(1) + endif + k=idum/IQ1 + idum=IA1*(idum-k*IQ1)-k*IR1 + if (idum.lt.0) idum=idum+IM1 + k=idum2/IQ2 + idum2=IA2*(idum2-k*IQ2)-k*IR2 + if (idum2.lt.0) idum2=idum2+IM2 + j=1+iy/NDIV + iy=iv(j)-idum2 + iv(j)=idum + if(iy.lt.1)iy=iy+IMM1 + ran2=min(AM*iy,RNMX) + return +END function ran2 \ No newline at end of file diff --git a/BasicWLC/SIMcode/sigclear.c b/BasicWLC/SIMcode/sigclear.c new file mode 100644 index 00000000..92961287 --- /dev/null +++ b/BasicWLC/SIMcode/sigclear.c @@ -0,0 +1,6 @@ +#include +#include +void sigclear_(int *signum) +{ + signal(*signum, NULL); +} diff --git a/BasicWLC/SIMcode/stress.f90 b/BasicWLC/SIMcode/stress.f90 new file mode 100644 index 00000000..a803a889 --- /dev/null +++ b/BasicWLC/SIMcode/stress.f90 @@ -0,0 +1,102 @@ +!---------------------------------------------------------------* + +! +! This subroutine calculates the elastic forces for a wormlike +! chain with a stretching potential. The stretch and bend +! moduli are fed along with the bead positions. +! +! Andrew Spakowitz +! Written 9-1-04 + + SUBROUTINE stress(SIG,R,U,NT,N,NP,PARA,INTON,SIMTYPE) + + DOUBLE PRECISION FELAS(NT,3) ! Elastic force + DOUBLE PRECISION FPONP(NT,3) ! Self-interaction force + DOUBLE PRECISION TELAS(NT,3) ! Elastic force + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION L0 ! Bead separation + DOUBLE PRECISION FTOT(3) ! Compress force + DOUBLE PRECISION FBEND(3) ! Bend force + INTEGER INTON ! Include polymer interactions + INTEGER I,J,IB ! Index holders + INTEGER N,NT,NP ! Number of bead + INTEGER SIMTYPE + +! Variables in the simulation + + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + DOUBLE PRECISION XIR,XIU + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION LHC ! Length of HC int + DOUBLE PRECISION VHC ! HC strength + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION DT + +! Variables for force and torque calculations + + DOUBLE PRECISION RCOM(3) ! Center of mass + DOUBLE PRECISION SIG(3,3) + +! Load the input parameters + + EB=PARA(1) + EPAR=PARA(2) + EPERP=PARA(3) + GAM=PARA(4) + ETA=PARA(5) + XIR=PARA(6) + XIU=PARA(7) + LBOX=PARA(8) + LHC=PARA(9) + VHC=PARA(10) + + DT=0.0001 + call force_elas(FELAS,TELAS,R,U,NT,N,NP,EB,EPAR,EPERP,GAM,ETA,SIMTYPE) + + if (INTON.EQ.1) then + call force_ponp(FPONP,R,NT,N,NP,LHC,VHC,LBOX,GAM,DT,XIR) + endif + + SIG(1,1)=0. + SIG(1,2)=0. + SIG(1,3)=0. + SIG(2,1)=0. + SIG(2,2)=0. + SIG(2,3)=0. + SIG(3,1)=0. + SIG(3,2)=0. + SIG(3,3)=0. + DO 10 I=1,NP + RCOM(1)=0. + RCOM(2)=0. + RCOM(3)=0. + DO 20 J=1,N + IB=J+N*(I-1.) + RCOM(1)=RCOM(1)+R(IB,1)/N + RCOM(2)=RCOM(2)+R(IB,2)/N + RCOM(3)=RCOM(3)+R(IB,3)/N + 20 CONTINUE + + DO 30 J=1,N + IB=J+N*(I-1.) + FTOT(1)=FELAS(IB,1)+INTON*FPONP(IB,1) + FTOT(2)=FELAS(IB,2)+INTON*FPONP(IB,2) + FTOT(3)=FELAS(IB,3)+INTON*FPONP(IB,3) + SIG(1,1)=SIG(1,1)-(R(IB,1)-RCOM(1))*FTOT(1) + SIG(1,2)=SIG(1,2)-(R(IB,1)-RCOM(1))*FTOT(2) + SIG(1,3)=SIG(1,3)-(R(IB,1)-RCOM(1))*FTOT(3) + SIG(2,1)=SIG(2,1)-(R(IB,2)-RCOM(2))*FTOT(1) + SIG(2,2)=SIG(2,2)-(R(IB,2)-RCOM(2))*FTOT(2) + SIG(2,3)=SIG(2,3)-(R(IB,2)-RCOM(2))*FTOT(3) + SIG(3,1)=SIG(3,1)-(R(IB,3)-RCOM(3))*FTOT(1) + SIG(3,2)=SIG(3,2)-(R(IB,3)-RCOM(3))*FTOT(2) + SIG(3,3)=SIG(3,3)-(R(IB,3)-RCOM(3))*FTOT(3) + 30 CONTINUE + 10 CONTINUE + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/SIMcode/stressp.f90 b/BasicWLC/SIMcode/stressp.f90 new file mode 100644 index 00000000..858b3c4e --- /dev/null +++ b/BasicWLC/SIMcode/stressp.f90 @@ -0,0 +1,155 @@ +!! ---------------------------------------------------------------* + +! +! This subroutine calculates the elastic forces for a wormlike +! chain with a stretching potential. The stretch and bend +! moduli are fed along with the bead positions. +! +! Andrew Spakowitz +! Written 9-1-04 + + SUBROUTINE stressp(COR,R,U,R0,U0,NT,N,NP,PARA,INTON,SIMTYPE) + + DOUBLE PRECISION FELAS(NT,3) ! Elastic force + DOUBLE PRECISION FPONP(NT,3) ! Self-interaction force + DOUBLE PRECISION TELAS(NT,3) ! Elastic force + DOUBLE PRECISION FELAS0(NT,3) ! Elastic force + DOUBLE PRECISION FPONP0(NT,3) ! Self-interaction force + INTEGER INTON ! Include polymer interactions + DOUBLE PRECISION TELAS0(NT,3) ! Elastic force + DOUBLE PRECISION R(NT,3) ! Bead positions + DOUBLE PRECISION U(NT,3) ! Tangent vectors + DOUBLE PRECISION R0(NT,3) ! Bead positions + DOUBLE PRECISION U0(NT,3) ! Tangent vectors + DOUBLE PRECISION COR + + DOUBLE PRECISION L0 ! Bead separation + DOUBLE PRECISION FTOT(3) ! Compress force + INTEGER I,J,IB ! Index holders + INTEGER N,NT,NP ! Number of bead + INTEGER SIMTYPE + +! Variables in the simulation + + DOUBLE PRECISION EB,EPAR,EPERP + DOUBLE PRECISION GAM,ETA + DOUBLE PRECISION XIR,XIU + DOUBLE PRECISION LBOX ! Box edge length + DOUBLE PRECISION LHC ! Length of HC int + DOUBLE PRECISION VHC ! HC strength + DOUBLE PRECISION PARA(10) + DOUBLE PRECISION DT + +! Variables for force and torque calculations + + DOUBLE PRECISION RCOM(3) ! Center of mass + DOUBLE PRECISION SIG(3,3) + DOUBLE PRECISION SIG0(3,3) + +! Load the input parameters + + EB=PARA(1) + EPAR=PARA(2) + EPERP=PARA(3) + GAM=PARA(4) + ETA=PARA(5) + XIR=PARA(6) + XIU=PARA(7) + LBOX=PARA(8) + LHC=PARA(9) + VHC=PARA(10) + + COR=0. + + DT=0.0001 + call force_elas(FELAS0,TELAS0,R0,U0,NT,N,NP,EB,EPAR,EPERP,GAM,ETA,SIMTYPE) + if (INTON.EQ.1) then + call force_ponp(FPONP0,R0,NT,N,NP,LHC,VHC,LBOX,GAM,DT,XIR) + endif + + call force_elas(FELAS,TELAS,R,U,NT,N,NP,EB,EPAR,EPERP,GAM,ETA,SIMTYPE) + if (INTON.EQ.1) then + call force_ponp(FPONP,R,NT,N,NP,LHC,VHC,LBOX,GAM,DT,XIR) + endif + + DO 10 I=1,NP + RCOM(1)=0. + RCOM(2)=0. + RCOM(3)=0. + DO 20 J=1,N + IB=J+N*(I-1.) + RCOM(1)=RCOM(1)+R(IB,1)/N + RCOM(2)=RCOM(2)+R(IB,2)/N + RCOM(3)=RCOM(3)+R(IB,3)/N + 20 CONTINUE + + SIG(1,1)=0. + SIG(1,2)=0. + SIG(1,3)=0. + SIG(2,1)=0. + SIG(2,2)=0. + SIG(2,3)=0. + SIG(3,1)=0. + SIG(3,2)=0. + SIG(3,3)=0. + DO 30 J=1,N + IB=J+N*(I-1.) + FTOT(1)=FELAS(IB,1)+INTON*FPONP(IB,1) + FTOT(2)=FELAS(IB,2)+INTON*FPONP(IB,2) + FTOT(3)=FELAS(IB,3)+INTON*FPONP(IB,3) + SIG(1,1)=SIG(1,1)-(R(IB,1)-RCOM(1))*FTOT(1) + SIG(1,2)=SIG(1,2)-(R(IB,1)-RCOM(1))*FTOT(2) + SIG(1,3)=SIG(1,3)-(R(IB,1)-RCOM(1))*FTOT(3) + SIG(2,1)=SIG(2,1)-(R(IB,2)-RCOM(2))*FTOT(1) + SIG(2,2)=SIG(2,2)-(R(IB,2)-RCOM(2))*FTOT(2) + SIG(2,3)=SIG(2,3)-(R(IB,2)-RCOM(2))*FTOT(3) + SIG(3,1)=SIG(3,1)-(R(IB,3)-RCOM(3))*FTOT(1) + SIG(3,2)=SIG(3,2)-(R(IB,3)-RCOM(3))*FTOT(2) + SIG(3,3)=SIG(3,3)-(R(IB,3)-RCOM(3))*FTOT(3) + 30 CONTINUE + + RCOM(1)=0. + RCOM(2)=0. + RCOM(3)=0. + DO 40 J=1,N + IB=J+N*(I-1.) + RCOM(1)=RCOM(1)+R0(IB,1)/N + RCOM(2)=RCOM(2)+R0(IB,2)/N + RCOM(3)=RCOM(3)+R0(IB,3)/N + 40 CONTINUE + + SIG0(1,1)=0. + SIG0(1,2)=0. + SIG0(1,3)=0. + SIG0(2,1)=0. + SIG0(2,2)=0. + SIG0(2,3)=0. + SIG0(3,1)=0. + SIG0(3,2)=0. + SIG0(3,3)=0. + DO 50 J=1,N + IB=J+N*(I-1.) + FTOT(1)=FELAS0(IB,1)+INTON*FPONP0(IB,1) + FTOT(2)=FELAS0(IB,2)+INTON*FPONP0(IB,2) + FTOT(3)=FELAS0(IB,3)+INTON*FPONP0(IB,3) + SIG0(1,1)=SIG0(1,1)-(R0(IB,1)-RCOM(1))*FTOT(1) + SIG0(1,2)=SIG0(1,2)-(R0(IB,1)-RCOM(1))*FTOT(2) + SIG0(1,3)=SIG0(1,3)-(R0(IB,1)-RCOM(1))*FTOT(3) + SIG0(2,1)=SIG0(2,1)-(R0(IB,2)-RCOM(2))*FTOT(1) + SIG0(2,2)=SIG0(2,2)-(R0(IB,2)-RCOM(2))*FTOT(2) + SIG0(2,3)=SIG0(2,3)-(R0(IB,2)-RCOM(2))*FTOT(3) + SIG0(3,1)=SIG0(3,1)-(R0(IB,3)-RCOM(3))*FTOT(1) + SIG0(3,2)=SIG0(3,2)-(R0(IB,3)-RCOM(3))*FTOT(2) + SIG0(3,3)=SIG0(3,3)-(R0(IB,3)-RCOM(3))*FTOT(3) + 50 CONTINUE + + COR=COR+SIG(1,2)*SIG0(1,2)+SIG(1,3)*SIG0(1,3)+SIG(2,1)*SIG0(2,1)+SIG(2,3)*SIG0(2,3)+SIG(3,1)*SIG0(3,1)+SIG(3,2)*SIG0(3,2) + + 10 CONTINUE + + COR=COR/6. + + RETURN + END + +!---------------------------------------------------------------* diff --git a/BasicWLC/SIMcode/wlcsim.f90 b/BasicWLC/SIMcode/wlcsim.f90 new file mode 100644 index 00000000..2994a96e --- /dev/null +++ b/BasicWLC/SIMcode/wlcsim.f90 @@ -0,0 +1,383 @@ +!---------------------------------------------------------------* + + PROGRAM wlcsim + +! +! WLC Simulation Package: +! Simulation Package for Brownian dynamics and +! Monte Carlo Simulation +! +! Andrew Spakowitz +! Version 1.0 +! 8/17/2015 +! + +! Variables within the simulation + + implicit none + + external WRITE_COLTIMES ! must declare sighandlers as external + + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:):: R ! Conformation of polymer chains + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:):: U ! Conformation of polymer chains + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:):: R0 ! Conformation of polymer chains + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:):: U0 ! Conformation of polymer chains + + INTEGER NT ! Number of beads in simulation + INTEGER N ! Number of beads in simulation + INTEGER NP ! Number of polymers in simulation + DOUBLE PRECISION L0 ! Equilibrium segment length + DOUBLE PRECISION ENERGY ! Total energy + DOUBLE PRECISION TIME ! Current time + DOUBLE PRECISION TSAVE ! Time of save point + DOUBLE PRECISION T0,TF ! Initial/final times + DOUBLE PRECISION DT ! Time step size + INTEGER I,J,IB ! Index + INTEGER INDMAX ! Maximum index in series + INTEGER IND ! Ind in series + INTEGER TENS ! Decimal of index + character*5 fileind ! Index of output + character*16 snapnm ! File for output + +! Simulation input variables + + INTEGER FRMFILE ! Initial condition + INTEGER BROWN ! Include Brownian forces + INTEGER INTON ! Include polymer interactions + INTEGER LOGTIME ! Is data recorded in log time? + DOUBLE PRECISION DT0 ! Initial time step size + INTEGER NSTEP,NINIT + +! Monte Carlo variables + + DOUBLE PRECISION MCAMP(6) ! Amplitude of random change + INTEGER MOVEON(6) ! Is the move active + INTEGER WINDOW(6) ! Size of window for bead selection + INTEGER SUCCESS(6) ! Number of successes + +! Energy variables + + DOUBLE PRECISION EELAS(3) ! Elastic energy + DOUBLE PRECISION EPONP ! Poly-poly energy + +! Structure analysis + + DOUBLE PRECISION RCOM(3) ! Center of mass + DOUBLE PRECISION DELR(3) ! Mag of gyration tensor + DOUBLE PRECISION RCOM0(3) ! Init val RCOM + DOUBLE PRECISION DELR0(3) ! Init val DELR + DOUBLE PRECISION DRCOM ! Change in RCOM + DOUBLE PRECISION SIG(3,3) + DOUBLE PRECISION COR + +! Variables in the simulation + + DOUBLE PRECISION PARA(10) + INTEGER SIMTYPE ! Simulation method (WLC=1,SSWLC=2,GC=3) + +! Variables for the random number generators + + INTEGER IDUM ! Seed for the generator + DOUBLE PRECISION MOM(6) + +! Variable to hold time of first collisions between each bead + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:):: HAS_COLLIDED + DOUBLE PRECISION FPT_DIST ! l1 dist to trigger collision + INTEGER COL_TYPE ! what kind of collision checking to use + +! Variables for tracking methylation profile + INTEGER, ALLOCATABLE, DIMENSION(:):: METH_STATUS ! methylation status of each site: 1 = methylated, 0 = unmethylated + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IN_RXN_RAD + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: PAIRS + DOUBLE PRECISION KM ! rate of methylation + DOUBLE PRECISION KD ! rate of demethylation + DOUBLE PRECISION KTOT ! total rate constant + INTEGER NUC_SITE ! bead index of nucleation site + INTEGER NUM_SPREAD ! total number of spreading events + INTEGER NUM_METHYLATED ! number of methylated sites + INTEGER NUM_DECAY ! total number of decay events + + +! Load in the parameters for the simulation + + open (unit=5, file='input/input') + read (unit=5, fmt='(24(/))') + read (unit=5, fmt=*) N + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) NP + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) TF + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) INDMAX + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) DT + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) FRMFILE + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) BROWN + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) INTON + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) LOGTIME + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) NINIT + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) NSTEP + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) FPT_DIST + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) COL_TYPE + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) KM + read (unit=5, fmt='(2(/))') + read (unit=5, fmt=*) KD + close(5) + call getpara(PARA,DT,SIMTYPE) + DT0=DT + + NT=N*NP + ALLOCATE(R(NT,3)) + ALLOCATE(U(NT,3)) + ALLOCATE(R0(NT,3)) + ALLOCATE(U0(NT,3)) + if (COL_TYPE.NE.0) then + ALLOCATE(HAS_COLLIDED(NT,NT)) + HAS_COLLIDED = -1.0d+0 + else if (COL_TYPE.EQ.2) then + WRITE(*,*) "Not yet implemented: KD-tree based collision detection." + STOP 1 + else + ALLOCATE(HAS_COLLIDED(1,1)) + HAS_COLLIDED = -1.0d+0 + endif + ALLOCATE(METH_STATUS(NT)) + ALLOCATE(IN_RXN_RAD(NT,NT)) + ALLOCATE(PAIRS(2,NT)) + + NUM_SPREAD = 0 + NUM_DECAY = 0 + +! Setup the initial condition + + call initcond(R,U,NT,N,NP,IDUM,FRMFILE,PARA) + + call initial_methyl_profile(NT,METH_STATUS,NUC_SITE) + + OPEN (UNIT = 1, FILE = 'data/m0', STATUS = 'NEW') + DO I=1,NT + WRITE(1,*) meth_status(I) + ENDDO + CLOSE(1) + + KTOT = 1.0 + NUM_METHYLATED = sum(meth_status) + + PRINT *, 'initial number of methylated sites =', NUM_METHYLATED + + +! Turn on moves for each simulation type + + if (SIMTYPE.EQ.1) then + MCAMP(1)=1. + MCAMP(2)=1. + MCAMP(3)=1. + MCAMP(4)=1. + MCAMP(5)=1. + MCAMP(6)=1. + MOVEON(1)=1 + MOVEON(2)=0 + MOVEON(3)=1 + MOVEON(4)=0 + elseif (SIMTYPE.EQ.2) then + MCAMP(1)=1. + MCAMP(2)=1. + MCAMP(3)=1. + MCAMP(4)=1. + MCAMP(5)=1. + MCAMP(6)=1. + MOVEON(1)=1 + MOVEON(2)=1 + MOVEON(3)=1 + MOVEON(4)=1 + elseif (SIMTYPE.EQ.3) then + MCAMP(1)=1. + MCAMP(2)=1. + MCAMP(3)=1. + MCAMP(4)=1. + MCAMP(5)=1. + MCAMP(6)=1. + MOVEON(1)=1 + MOVEON(2)=1 + MOVEON(3)=1 + MOVEON(4)=0 + endif + +! Turn off whole chain rotation and translation if interactions are off + + if (INTON.EQ.1) then + MOVEON(5)=1 + MOVEON(6)=1 + else + MOVEON(5)=0 + MOVEON(6)=0 + endif + +! Perform an initialization MC simulation + + call MCsim(R,U,NT,N,NP,NINIT,BROWN,INTON,IDUM,PARA,MCAMP, & + SUCCESS,MOVEON,WINDOW,SIMTYPE) + +! Save the conformation and PSI angles + + OPEN (UNIT = 1, FILE = 'data/r0', STATUS = 'NEW') + IB=1 + DO 10 I=1,NP + DO 20 J=1,N + R0(IB,1)=R(IB,1) + R0(IB,2)=R(IB,2) + R0(IB,3)=R(IB,3) + U0(IB,1)=U(IB,1) + U0(IB,2)=U(IB,2) + U0(IB,3)=U(IB,3) + WRITE(1,*) R(IB,1),R(IB,2),R(IB,3) + IB=IB+1 + 20 CONTINUE + 10 CONTINUE + CLOSE(1) + + OPEN (UNIT = 1, FILE = 'data/u0', STATUS = 'NEW') + IB=1 + DO 30 I=1,NP + DO 40 J=1,N + WRITE(1,*) U(IB,1),U(IB,2),U(IB,3) + IB=IB+1 + 40 CONTINUE + 30 CONTINUE + CLOSE(1) + +! Begin simulation + + IND=1 + TIME=0. + +! Open the output files + + OPEN (UNIT = 2, FILE = 'data/out1', STATUS = 'NEW') + OPEN (UNIT = 3, FILE = 'data/out2', STATUS = 'NEW') + OPEN (UNIT = 4, FILE = 'data/out3', STATUS = 'NEW') + + call stress(SIG,R,U,NT,N,NP,PARA,INTON,SIMTYPE) + + WRITE(3,*) real(SIG(1,1)),real(SIG(1,2)),real(SIG(1,3)),real(SIG(2,1)),real(SIG(2,2)) + WRITE(4,*) real(SIG(2,3)),real(SIG(3,1)),real(SIG(3,2)),real(SIG(3,3)) + + DO WHILE (IND.LE.INDMAX) + +! Perform a MC simulation, only if NSTEP.NE.0 + + call MCsim(R,U,NT,N,NP,NSTEP,BROWN,INTON,IDUM,PARA,MCAMP, & + SUCCESS,MOVEON,WINDOW,SIMTYPE) + +! Perform a Brownian dynamics simulation over time step + + if (LOGTIME.EQ.0) then + TSAVE = TF*IND/INDMAX + else + TSAVE = DT0*exp((IND-1.)/(INDMAX-1.)*log(TF/DT0)) + endif + if (NSTEP.EQ.0) then + call BDsim(R,U,NT,N,NP,TIME,TSAVE,DT,BROWN,INTON,IDUM, & + PARA,SIMTYPE,HAS_COLLIDED,FPT_DIST,COL_TYPE, & + METH_STATUS,KM,KD,NUM_SPREAD,IN_RXN_RAD,PAIRS,NUC_SITE,NUM_METHYLATED,NUM_DECAY) + endif + +! Save the conformation and the metrics + + TENS=nint(log10(1.*IND)-0.49999)+1 + write (fileind,'(I5)'), IND + snapnm= 'data/r'//fileind((5-TENS+1):5) + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') + IB=1 + DO 50 I=1,NP + DO 60 J=1,N + WRITE(1,*) R(IB,1),R(IB,2),R(IB,3) + IB=IB+1 + 60 CONTINUE + 50 CONTINUE + CLOSE(1) + + snapnm= 'data/u'//fileind((5-TENS+1):5) + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') + IB=1 + DO 70 I=1,NP + DO 80 J=1,N + WRITE(1,*) U(IB,1),U(IB,2),U(IB,3) + IB=IB+1 + 80 CONTINUE + 70 CONTINUE + CLOSE(1) + + snapnm='data/coltimes' + IF (COL_TYPE.NE.0) then + OPEN (UNIT=1, FILE=snapnm, STATUS='REPLACE') + DO I=1,NT + WRITE(1,*) ( HAS_COLLIDED(i,j), j=1,NT ) + ENDDO + CLOSE(1) + ENDIF + + snapnm='data/m'//fileind((5-TENS+1):5) + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'NEW') + DO I=1,NT + WRITE(1,*) METH_STATUS(I) + ENDDO + CLOSE(1) + + snapnm='data/num_spread' + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'REPLACE') + WRITE(1,*) NUM_SPREAD + CLOSE(1) + + snapnm='data/num_decay' + OPEN (UNIT = 1, FILE = snapnm, STATUS = 'REPLACE') + WRITE(1,*) NUM_DECAY + CLOSE(1) + + call stress(SIG,R,U,NT,N,NP,PARA,INTON,SIMTYPE) + call stressp(COR,R,U,R0,U0,NT,N,NP,PARA,INTON,SIMTYPE) + + call energy_elas(EELAS,R,U,NT,N,NP,PARA) + EPONP=0. + if (INTON.EQ.1) then + call energy_ponp(EPONP,R,NT,N,NP,PARA) + endif + WRITE(2,*) real(TIME),real(EELAS(1)),real(EELAS(2)),real(EELAS(3)),real(EPONP),real(COR) + + + WRITE(3,*) real(SIG(1,1)),real(SIG(1,2)),real(SIG(1,3)),real(SIG(2,1)),real(SIG(2,2)) + WRITE(4,*) real(SIG(2,3)),real(SIG(3,1)),real(SIG(3,2)),real(SIG(3,3)) + + PRINT*, '________________________________________' + PRINT*, 'Time point ',IND, ' out of', INDMAX + PRINT*, 'Current time ',TIME + PRINT*, 'Bending energy ', EELAS(1) + PRINT*, 'Par compression energy ', EELAS(2) + PRINT*, 'Perp compression energy ', EELAS(3) + PRINT*, 'Polymer-polymer energy ', EPONP + PRINT*, 'Current number of beads ', N + PRINT*, 'Time step ', DT + print*, 'End-to-end distance poly 1 ', & + sqrt((R(N,1)-R(1,1))**2.+(R(N,2)-R(1,2))**2.+(R(N,3)-R(1,3))**2.) + PRINT*, 'Simulation type ', SIMTYPE + PRINT*, 'Number of spreading events ', NUM_SPREAD + PRINT*, 'Number of methylated sites ', NUM_METHYLATED + PRINT*, 'Number of decay events ', NUM_DECAY + + IND=IND+1 + + ENDDO + END + + +!---------------------------------------------------------------* + diff --git a/BasicWLC/dssWLC/doc/README.aux b/BasicWLC/dssWLC/doc/README.aux new file mode 100644 index 00000000..80809fba --- /dev/null +++ b/BasicWLC/dssWLC/doc/README.aux @@ -0,0 +1,22 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {1}Compilation Instructions}{2}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Usage Instructions}{2}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Examples for a Quick Start}{3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Example 1: equilibrium sampling}{3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Example 2: Brownian Dynamics}{3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Example 3: Looping first-passage time}{4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Example 4: Looping first-passage time, with dynamic rediscretization}{4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Example 5: Monte Carlo}{4}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Auxiliary Scripts}{4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Visualizing structures}{4}} +\@writefile{toc}{\contentsline {section}{\numberline {5}Parameters for the dssWLC model}{5}} +\newlabel{sec:getparams}{{5}{5}} +\@writefile{toc}{\contentsline {section}{\numberline {6}Description of Specific Calculations}{6}} +\newlabel{sec:tasks}{{6}{6}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}EQUILDISTRIB action}{6}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2}BROWNDYN action}{7}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.3}MONTECARLO action}{7}} +\@writefile{toc}{\contentsline {section}{\numberline {7}Keyword Index}{7}} +\newlabel{sec:keywords}{{7}{7}} +\bibstyle{aip} +\bibdata{fiberModel} diff --git a/BasicWLC/dssWLC/doc/README.log b/BasicWLC/dssWLC/doc/README.log new file mode 100644 index 00000000..cb94350a --- /dev/null +++ b/BasicWLC/dssWLC/doc/README.log @@ -0,0 +1,218 @@ +This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=pdflatex 2012.4.28) 15 JUN 2013 21:34 +entering extended mode + %&-line parsing enabled. +**README.tex +(./README.tex +LaTeX2e <2009/09/24> +Babel and hyphenation patterns for english, usenglishmax, dumylang, noh +yphenation, loaded. +(/usr/share/texmf-texlive/tex/latex/base/article.cls +Document Class: article 2007/10/19 v1.4h Standard LaTeX document class +(/usr/share/texmf-texlive/tex/latex/base/size12.clo +File: size12.clo 2007/10/19 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texmf-texlive/tex/latex/ltxmisc/url.sty +\Urlmuskip=\muskip10 +Package: url 2006/04/12 ver 3.3 Verb mode for urls, etc. +) +(/usr/share/texmf-texlive/tex/latex/setspace/setspace.sty +Package: setspace 2000/12/01 6.7 Contributed and Supported LaTeX2e package + +Package: `setspace' 6.7 <2000/12/01> +) (/usr/share/texmf-texlive/tex/latex/amsmath/amsmath.sty +Package: amsmath 2000/07/18 v2.13 AMS math features +\@mathmargin=\skip43 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-texlive/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 + +(/usr/share/texmf-texlive/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 +\@emptytoks=\toks14 +\ex@=\dimen103 +)) +(/usr/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d +\pmbraise@=\dimen104 +) +(/usr/share/texmf-texlive/tex/latex/amsmath/amsopn.sty +Package: amsopn 1999/12/14 v2.01 operator names +) +\inf@bad=\count87 +LaTeX Info: Redefining \frac on input line 211. +\uproot@=\count88 +\leftroot@=\count89 +LaTeX Info: Redefining \overline on input line 307. +\classnum@=\count90 +\DOTSCASE@=\count91 +LaTeX Info: Redefining \ldots on input line 379. +LaTeX Info: Redefining \dots on input line 382. +LaTeX Info: Redefining \cdots on input line 467. +\Mathstrutbox@=\box26 +\strutbox@=\box27 +\big@size=\dimen105 +LaTeX Font Info: Redeclaring font encoding OML on input line 567. +LaTeX Font Info: Redeclaring font encoding OMS on input line 568. +\macc@depth=\count92 +\c@MaxMatrixCols=\count93 +\dotsspace@=\muskip11 +\c@parentequation=\count94 +\dspbrk@lvl=\count95 +\tag@help=\toks15 +\row@=\count96 +\column@=\count97 +\maxfields@=\count98 +\andhelp@=\toks16 +\eqnshift@=\dimen106 +\alignsep@=\dimen107 +\tagshift@=\dimen108 +\tagwidth@=\dimen109 +\totwidth@=\dimen110 +\lineht@=\dimen111 +\@envbody=\toks17 +\multlinegap=\skip44 +\multlinetaggap=\skip45 +\mathdisplay@stack=\toks18 +LaTeX Info: Redefining \[ on input line 2666. +LaTeX Info: Redefining \] on input line 2667. +) +(/usr/share/texmf-texlive/tex/latex/graphics/color.sty +Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) + +(/etc/texmf/tex/latex/config/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package color Info: Driver file: pdftex.def on input line 130. + +(/usr/share/texmf-texlive/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2010/03/12 v0.04p Graphics/color for pdfTeX +\Gread@gobject=\count99 +)) (./README.aux) +\openout1 = `README.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. + +(/usr/share/texmf-texlive/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count100 +\scratchdimen=\dimen112 +\scratchbox=\box28 +\nofMPsegments=\count101 +\nofMParguments=\count102 +\everyMPshowfont=\toks19 +\MPscratchCnt=\count103 +\MPscratchDim=\dimen113 +\MPnumerator=\count104 +\everyMPtoPDFconversion=\toks20 +) (./README.toc) +\tf@toc=\write3 +\openout3 = `README.toc'. + + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: Try loading font information for OMS+cmr on input line 26. + +(/usr/share/texmf-texlive/tex/latex/base/omscmr.fd +File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <12> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 26. + [2] [3] [4] +Overfull \hbox (36.07521pt too wide) in paragraph at lines 125--125 +[]\OT1/cmtt/m/n/12 [eb,gam,epar,eperp,eta,alpha,zetau,delt] = dssWLCcalcparams( +del,Nseg)[] + [] + +[5] +Overfull \hbox (97.82524pt too wide) in paragraph at lines 151--151 +[]\OT1/cmtt/m/n/12 [eb,gam,epar,eperp,eta,alpha,zetau,delt] = dssWLCcalcparams( +del,Nseg,`alpha',a)[] + [] + + +Overfull \hbox (227.5003pt too wide) in paragraph at lines 157--157 +[]\OT1/cmtt/m/n/12 [eb,gam,epar,eperp,eta,alpha,zetau,delt] = dssWLCcalcparams( +del,Nseg,`intepfile',`dssWLCparams.txt')[] + [] + +[6] [7] +Overfull \hbox (2.35567pt too wide) in paragraph at lines 216--217 +[]\OT1/cmr/m/n/12 value: 1 re-quired in-te-ger (BD-STEPS), 1 op-tional float (B +D-PRINT- + [] + +[8] +Overfull \hbox (38.30537pt too wide) in paragraph at lines 219--220 +[]\OT1/cmr/m/n/12 dafaults: BD-STEPS=1000, BD-PRINT-EV-ERY=1, BD-PRINT-LOG=fals +e + [] + +[9] [10] [11] [12] [13] [14] [15] [16] +Overfull \hbox (18.32333pt too wide) in paragraph at lines 510--511 +\OT1/cmr/m/n/12 EC will be ex-tracted from the in-put snap-shot file (set with +\OT1/cmr/m/it/12 RESTART\OT1/cmr/m/n/12 ) + [] + +[17] +Overfull \hbox (1.7019pt too wide) in paragraph at lines 551--552 +\OT1/cmr/m/n/12 Kutta are im-ple-mented; only 4-th or-der has been ex-ten-sivel +y tested + [] + +[18] +Overfull \hbox (24.69434pt too wide) in paragraph at lines 576--577 +[]\OT1/cmr/m/n/12 1 op-tional in-te-ger (EQUI-L-SAM-PLE-TYPE), 1 op-tional floa +t (STARTE- + [] + +[19] [20] +No file README.bbl. +[21] (./README.aux) ) +Here is how much of TeX's memory you used: + 1499 strings out of 495061 + 17923 string characters out of 1182621 + 72758 words of memory out of 3000000 + 4700 multiletter control sequences out of 15000+50000 + 10449 words of font info for 38 fonts, out of 3000000 for 9000 + 28 hyphenation exceptions out of 8191 + 27i,8n,20p,686b,241s stack positions out of 5000i,500n,10000p,200000b,50000s +< +/usr/share/texmf-texlive/fonts/type1/public/amsfonts/cm/cmmi8.pfb> +Output written on README.pdf (21 pages, 164869 bytes). +PDF statistics: + 110 PDF objects out of 1000 (max. 8388607) + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/BasicWLC/dssWLC/doc/README.pdf b/BasicWLC/dssWLC/doc/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..61cfdc65b1d91fbaccb2bbea451c405328ee46ac GIT binary patch literal 164869 zcmbTeW0WOp*0r6sZL`uwrES}`ZQIVQv~AmVR@$~I?X0)@w5ms+Z#<{J{p%hv;*Qw+ z$6nW5bIk}+IUx}m23lq)(%FTf6(}YGdIDPm3j!`KC^{))8&fAU0uFXIg1>*D=tRt| zoQxd^=tQjaos5Ny4Q-8#p?G+p9Gx7D^{t`Y))rNz9oJbAy53ZOh)o4i000qu%b?-F z{Ti{kBEgu|2%a85BPAwJIy(GVa~%M!&|Kb}JvLZIH;i<|bG2?ew?mfOHv@i;KV2}? zCu^Gq#ZD?=k4aq(j8-BvPU2^p&kl_?vE#^IL5`@ZKd0=$4VX8jsaQiUFXis0%|@}3 zJe~1gzL0aI*hwj8T{d>`G-Mu!G@U@O7huH9zay#0(OG=~NK@{-RB0<`rMd=5t)=m` zUj^7|bss2@L@!`azyyKue6zFvT=3^w z8802%3;L75<);_RrMGM#Lp}vK9%Y`u9{5q4wS39CpS^i&W-Yz#1CqaNN7Jw`(+d=+ zjCyBNcD&U1)++_@ojZ;Y&;|)=Kb^`jk;3(NkXB-e_?nx~@}8yV+11?v>*#BiEZ^%= zen!jM8JO{g4riTj{l59JN65JzW1dQEbOgkW5vpj9_vr5Ofdr`z<^ey8a!T2- zeSBoLYhhVEp&S88N8yzk{0HWn><^9rpMki;$CN9D{kKwkS!*ftoS8Fy9@ATnHgDh| zH~gU$#Z1HK1#GJ*f=`ieW>(nN4(IdVn~W9xlOhf<-NQdR4|*jpZjqFNfZWESu6{WD ze8Hx3J$2(>N8xhOb_-6GgsJxo8xWz39&!OWOtrsR=@Kr`biB6I{eGQtO*G--lzll! zymlOuHtM}f=H1L~@or)Eu3*HQo75fsd1Ztlx;TJGQ!9$^(lSeUcQoy~o6nH3w#5ADuEimZ@iteJh1c=DDCY#L)K=AFm0 ze$heX#L)ro3Ow-3=F94yn}-_%uP@GlR54x5VWI_VU%E%db$5GxRmNfMJ?%r)c_`*P z*!s{WCC)P<@&FvdSkR!?#sGdf4jtSlP`N8_43x2r(Les>zgE901Qg?Ml|sqg&X|Bs zPT$lRicZkh#>v>m$&ui1r9=UWPQlpG*4e?(*pYzY?+2ufjm-50Y~2Vn>3mSQsHHl8n!PZdG*oi>%*EbUqA)r$-c5@=o{#CC2b>+X^|DTusN3mmIWnuZN#jZ(p z)Am=f^S##9H=<)ipvosXE9k}hUb(tvVma4N5n&DAD7`LZB%WJHvZdSe6|YPzMxhe; zwQxV4YwP%0rq7BE+N7r&;^JxXc4){MV@mBTG-{;b&}CR{$CQtZ>v4cRi-xU%mz!0W z9?jvpoO7WZp{jiRg-D|9sn|+mvnqaW@~2LBSE~tS*bm2P!6dXvH2u9$OmdD1cQg-F zEm%ccYa?+jl57e#p_A&uOBdS~3+>BB_RRS+_Ry~Kf}yT2P@LKl=Aida&C2phZm&AY z9jT>SwvR*3C@@VRcl%+1<#qVr9A&Snz26fh4d?wPiB=d&Ks&#MPLo-y=A%&=5>l7b zct7b`0AkIZd1N!xe6K=tJW6)onL!svai8dN0y>7K*C*aQ3<*otmkggCC$34h!);Dm z1_G=G7@B*6fr&s?xY22Pi;q;WZDEm39dsFg+rD26xFFLt{yCyrV?)cU|5(U+#vKZXs6vptdpmrVMdCr@nw`*9))bu97vKXfXA6|DPi=jYaxY1aQ>cw7TKqbhEfvi zJTsyj)Pv`)Tr*X=-F0gh{Oid;-KL>`usRrltMw?8$(XH75*7937h_)e$sO*1YcJ$dZ+L=cL(CdUS`J=I%7mF>O_ickGUQPWj;?BUnmGI z;p;a>rzC4x_I3icx3^&$m@kR_lx>?xde!DQ+!$$%1h@FJz7t^XZ+yq(3Br0tS^)5c zU^$_{#@#5VcJR{SPuR^KI>a_k*$n&|!eB7ZaHa{wW(*awQr)WvuFiED57ohkU!$uTi}&v3{XpXXY#Ebt#6I?e!({ zgX@~u4WT9R+V3qfcey0h`dx1ig>*x<-s+-MzQ;)~1|ve;y-*mGcGi&DwUkt20=)>D zo|%a1YK_Z=D--;fbymd2T23zJyGz{Nn0W(!VF!b6U!GV^jZa7`9KV}|42G6h7yX>o-8I71gQIr(LdIcOI9Y88jhT@j&`m zD^xCM{aKz)YDKo#8vPpvOv1=Qgem))qPL9H@Lu}Nhwd378b;?8tgwipNuJXM zq8czToR{0V0bT=Xz8G0K8LS#@RPR3@PN7oiN}qM`(g&r8;+i8vL`GsTjJ`4z;pdf53!^A1>fCg z9AAE?WGok$43hk9hwv5(0ehA2#pXnuSfW`Wwvpi|1d-3!C&3%Le)yed2i{<@Jx_+^ z@?|VmE}HlZKpxLjn0-s8QEP3!{Z(Y7R*{~md;nPFEkvytEbWqv0s0jSK*`0DvY7tR@Gr4Xmozr(%9fU_djKHp2YWwWteN`o|x<2KH7=tgpzAmrX+uY9)z* zhnD>GV5WLWTywzRzF`tu$LwGd!>m>B*lqKi~#YSvj{x}R!B833^s6MTz%;VzfpFgPpMp=$@41Ch^3 zMR311WF8*&Y>URb>@C#LG~*bA=TqDg3oHBqXx?s!gEyCty+zNg=|+_bcGiXm;t>Dw zJ+qX-ct&|nP4oudBW=sOX|zaVlymp1gNYn#NA?vD{qOGN_Zk=z!P(bm#ZAE))D3zp zzWb}Ro$Y0}ugLHf_09D~soHHK6vU9{UE1$WpOE8p&V~6D`X4;;TAm#9CFb^4fE;2{|-7>ZyL-9P_18z#Ltpf6JR6 z2FJl#W`GoRrZdNQS%hrLX#NoaLP!;H?XGKc8pkcGP7P)V-Q}KJKaO!B#1gLnz?BY# zjUCiSc&*2I8oS7*JhT9atiOFs5(z3(roA%quH+uiu(Ahn#i=gZ+%J64N-wr!qVO=N z)l_tnC$FfAZek~@;-JZ+<7PcRnznE5g)%ea*}R;SJf=RjVLM|<OM zO+BLxjPPjORbbBPYn1^^SBp%KFp!*Du82BP;c3*~Svid7UAtawWt0H%c%6MaP*?Bz ze3xXX;B~Xo=o&AVqz7UBb%TS*=FY;i+<|k{{W694!9XQ;05k+=eYm5Qx>J+yW-Wm$ zWwF*N1zzJ_yTxzXTrFW+O=g0w9qh5fVoA2V?~H4~DJ) zS^kB6faPMr@_Xuef|X8uYJ?mkNKPxfB9U{mHRu!U z5J!*Kit5Q3&0M%{eTc}xFHB;XMaW}s@Lio|hYTYlqPRl4z5`D!hrvhjJqg`$vfLu} z01?AY*b#=W7m*`PLRrSwk5;SzxM3du*QPJJAa`GkYVV z3_cWrA5UA6Q6hZEoZ@AwHnxa#8RMUyyPn25c0y72HaSVlnoiz$EBp&<=UAr~<(7s1 z6%7K@FT@-XafOtOI#iW-4EdPxiWfmU7t`oQg}jJMqb`~Ts#IF7Z`7xjr`by4lLRT} zToB1suAA8-2k#VfcYOVi)kR`)TnRjby0W{-MA@PD`RWvGNElWb%}oll>Fqx#(@&QB zgV&I&kov*vLQICjLB81Q@Y=GIi*zZN$328m_$KQ>~~O6*n4eP^$XQ_tr~K$>_-{SPx$WMwCmI zFBtkIdSLZ7us)A@EhBOXM^ECnhRVq%Dw*?_G!8}qqa5KtMgQJCipY13`z&Au^v z;YDT@-lA{Wrx5`M8(0LpCDv%_qS`^V6v5ar^x;1QoB=*}I(0W-4d*L2*U|OwU#HO+SPTMBp3?GPry8 zd~!E-(lPkFSBXqz$OMvDL4A-rWq)ayDyp$_xnOTtw*QH;)poJ>qmQK{U1a+wMPfHo z*4t8)_>XYsn2~PR(rRtfVNfcGw``_!y6;BV_~laMY|EzetjF!G3lTGJS2E}HAy552 z1qL&fWi&^4(9t&%r*BXD+)1D65;a)l;Zj?LpWf$``##^cO4&YcH-{`_o3N3H;0vvD zm6ulwu(x3vsjy52lP;7~U~L;Tvt7^8e*$GW&zS!=?iv2p?EVvpf6n_qdf@-)y#MHx zq3Hfc;4}Pf+dpshZ{q*faQ}|>--H0;FUtSX$N!=~BMSk;A9~}j5ufq*e*a&@XW{s( z#9vgCjNSM}{9{!Zk6VB`1MYXIS;0gy&7*A?s(3L zTArBUDAMsLFY@VDjw?nPIoZbgUQM2ldsT7R)oDt>D;HO6nWmNFi^Zd;$mJUs=~KGl zMh+Pcw6_OS1y?dvtHt$`$S)2VN9rk^*nUT2cJ&|rDm+G7(KZsYYaHGXdx@8mkJp=Y_4_@kFUZlAFIf^ zKp@Q{49j2J-xw0ahLH8~5TOxwL11Az`_-A@28oshR9f;gQD}M5B)sX9{B%n(9t_~F zI4HHg4r}HX&%7^PUuuNeQyDXIZHz&iT}? zX9}IZ#|R%o1SbwIsLM5kQD}y|6^*XX`9W@X--Ci!!1AHb36}N5Y~nP&ca|hfnido| zGuoVL`HkS)sC&|m{(g7fm=A{Nz6{D|ci(ftOj)Tz3i@KxImYRMv;V}#6;r4zy1zndgcZ)5_R$aj@DOnPpsSI}g7X zcBBl$*bE6FjLZnJ2X&0C#0^3I=-skJ9b)3cr!#S& z7|p3zrsmIOk$l#y{DlGtw5opcS-N5n)j~LJ^VlZbi!0@LMc4gS4^bUu$NMhnwIK;q zFAM-#LS>@1;W~T)O=MoJ1%JwjS5Z+bTnx+kUDuNiD1JuL3?T1`=-exe%YN|I7oa*aEZh?0~0Adp)+_&Bb7M3nY4v#h*MIOg;!3 zVY#%kMZGL2!NXD+hA5JC;XRy+$yu{#rD!c6#>_MitveDxBGCrobYSilR+CV_vZ%9a zHN#QwL>;;{Gs^l1UO9m0DsMm6*3z)pFo9_WUkp8lN-ogIrQ3<2==KuIn?yOH@)y}( z&A8TlObyhX+M|Y^MNqbB*)Q1(qoGdZ@gi0K2%~ygL*;^3{h^!t3ZPot>r*x2^1Rg1 ztmIVX54foJnuj$?tgx?YL!}+!G#Eb;Dbo$e6|nImOcS*dX$TA_5%p4~N?oZ=qD;7aa1tlPp~y6(*~#|2oJl;vnf_q9Fs+vx z-Do%@YC099N~3^*j%ha91b{=+fuAzr^g~!)-@04L@}1@+fb*xd}{bfw8t>yCZJ{2td%uex?tpvvcr{bU+uElcUXWGvFOP zhd|+f$D6%@NoJWgZO7lKzeI#*7eX)`SjtB3plJ<2kITQu+ojgykRbp)cFFHRk7F># zi8mFEx1bJ^?XO^PG5R?KQU|vuUptR42rnQpf3&%SJdQ<_u?Rf{PK&Be*{9eTG6d`; zBZ|W3TJQH9yKTB1Px66G@PoSC4b45ArmcvV*llkHV^}s11J+v~*pow;$P_($UboF+ zL<6`7FJ-4rak*MWlU7|_RaLF={h=|Ql$oQ~ghE`t3_>84$kt`%6A&wZBlN%30ORi- z_MfVOKY;ol-9N+M9D`p+{#P~dyV3A(HSinue-j43D}etH3IC%S_+5egLk%#}bNuE0 zzY0@3cAfQ>yQe>vae5*Sr7U&}R5<+t%{oyq4x<$~oyX4DgGMMt%iAgA{WW7(uKwWr z>EjjN5>`yez)N;sN)4Wh*TV9U6_<*OmmBMOLw>;?qx=b-=`krit}dARwvQ(O0S~OSIsKl)z9a5nL<0D ziKY}c4BgGqpfRa=hV}RX&G{N(rEi`ZXuU$ky+-!=5m1V#g2u1)K5AjPM4Ic5eUHZc zl8V=zW;vFQICUj{WCSDJ&83d~0kB$^{*Z3w0Gp!ZdFZr1U;K-oqIY^^CYvC{{BZ zh|`$IiwjsxNF;%C=+*Xon(Hjrxh8wG0?W<2l49VVfynJ2Bh5iYxxhOEV_yB}F$Z-Q zJ-uc2*&_Jq-m)kN*91ADlC%ckCi04!L=;iH5lvhz2AiiV8WH;=5({UxLN<`-ABdwQ5iz_oGgX!jcWlsa4sS z7~`lOl2)T|5hP&rQ;s4at_R+Ow5GyzGFOKThT$3)Rs%L$RHNbtEv6BO;b~ywMg3a5 zk#Hy4xzZzQldJGwf%|X|f}h}9XXeuLF*FqUgrKBsYspA}jIkh4kE!L+>%?vV7Kgw| zLV!^yBGCEXkiLnA;3d%&-**r|z=M1=G{84v`V|BtB?x{1aZZ0|44fV2o|8xrYM6ss9ON-MuaVL-!<)jvYYl@8%*oJ+~ zJo?<}#b86%!SgnATU*((7IWfG9z_l%n1#SXZ2qk8o)aj*dS2;^j4XeMw}cDAW=8BK z!a(enVMnYl3vr(AYXDnZ*bFO!Ov4F{th0e&CLr?Sb}vMg_?{sUWC`_!I7I;B;MR=W$!>_A@h-j_ah7dq?B;0|U`OQ42+yYhFwxTwTH z(8YxO#s$K!9>Ql%DV3%c2m}ddSS6K2RE2S_wk0 zPFSP?Qh^FYh@w~K?m_Zi>KF+wj2wGs;j2X9vOw92xgMtQ<+3b6A@V+-gM^B7An9vu zCbmnaI-s{AZ^9qf;tI95;XuO?Eo(CJ5&c`?&hd%xB-yu6p)Vr|yN9b67p8mH znnSB2K=BjXXDJW`n+dgos zwBtsdDh>S1FKYx>UlW`t@Zo%$lZAvC1Sk)1h>;Ol1bwkQ0_cV*g!=3n`bL$ikJ@0< z`ZM%=rx=^f7M8ILZW}`=j$kjY=~u~VA9Hp5hL4>~WhHh{I=VC5_kG)!hIbVh5WTa^ z;p9r6bfT!D23QD5+MHm+mmpyo*-qUl-FvkdCbP@bGC4tDQ$3>z8}8)+Nsy&h3_N| zV|qfKMyF&+3%8t5bj4XgSR~rhb^HD-a2<8CnwJ@htaG&5KdGiwjRDavgBMAzMgiRX zMIGzp>I1%}Sq(w26S0p#ky?_jT1T>5&xQLOCVifrt|*AW0p31ai%tvRDBT)XMZDC2 z2o7y*0zgbJQK$Ur^$`}V_i>#Zl1Ke5*l9e*fc8~h2l9N(}|Q21(VX;Y|ytgfu!-?{g@mxnUW9o zdBKi6ZCYkNf$?EM1^z@?{T_w-b7l1pSLNRc2gX0f9RIVj`eWOF`z(L1to}ny{i)CL z%X48T_+`8NW8%UxREUHA| zAuv(A#gUKh72Y|L5`C6r@y4l0Zt0vz7fIdoJ!tgtC6`zn8bs{3Mr=fh4quCw=$_Iw z&6$>}m_v`(yW5<^HZe6EQ+kWyCPKptW5k?XQBb8Ah_ z>xhpR`IlWe)zJ1)P06SpX+zw@!#UPLIcvFkRolbS%rD~K#8K7O!y(qN<-kboCJonT zzFx&^y!ha9s!OC`xO1vG%p}VorI2b7C{70T?yDtG+7^z?PGRmVNP}5TW^fovWPN+F z(Dhe7JJmATqUL!18r>|!FSxg|^1WIE9g~sCNURY5mUBBV9y=X9+Vsa;Ci>=_kS!d2 zalE$v$q6c==l(pi)tg?N-g_`LKxKUknMgMC++B07Sn=tX5x0;R;*E5nlv2wGS%L#t zc~)h0mDcN3WG%ejX9nAe_xLn6W$D4pkVFweUGhw0bJno@T)2P+rKh?_!4nd~Zz=X8 z3869!QYYE_wxe_V!ff3h6_f0C9D|t)iESW?cS(<*M);<(FE%E9hd&I@2PT_esOjL> zy&gNPONho}8=7d=b4u>i1_|o0muhF3b9l9CZXFK$i(dK-;i4M8j_$6~T?M5!;FJ;- z0zNqyk&HNKx`}e38;c)-FA#l)!*#}KcTZ%iy37P_6Q#8>+g6MXYV0WY#$dMoRMU{i zklz?08C*Bu1(;PE#?$!DUVd4=2FO@-nGWHt!0|0EV0r&U4r;h~1y>F%tNkS49UvZ_ zmbxN=07`|`x#{k$`H|5E&%$nEAMq&vIocSn~Mr>yc3ZWtR8NRkd}kzU4}q4s#bd3-8WDK`7r z=;M!|hJ;+)rLoT+3<3@tt%OT-nUQ*Mq)@aM4L8^GZS;^4DIf?K3*sUG?--m4OoT%S zzOtdi2sE#;sT2&YLjB_7+KC=tyN#&qk2fRk>JD@H4D9J`uke|A9`zOd9Y=if_{|xFF>TU{^mS0P4(49_vIdl!I zt61eaBLJt>Mjj$>dGpDB4S-U4$UUEhT#kvp{^F+8cO|HK5wYE+9ey$krL6*9VGhQS zdU9P_jA;~c?C_9Y2%-d_OJ>IUtq>8uSY!OVJS;b_HUnm4Ou+!=kSGwqWZFFm*)cx@ z=zdp{!BHK_|NZN3E_pQcwa>_ zY)fnV=N3NikCe(H1#tR{0ZbwIT6^k2o!E-OO`!GMJ^tyTL+wlUQd+a#*BE?JLG4Fz$EyqwkhMcBKbkEKjVzbr7UOxd}gZ z>S{CkIFbz}Rn6I~Jw1w(Q!nWj8Jcz6r7UR%t=oonZ!U%0gA^}{llDYo}ZxSR4rTl#usH$>6D7ny%3ad^l;_-A1`Up-T5}&jL<1 z8HT_om3n5!l#s0B)6k9p64OY8SvRSYnY$`x=m%H8kA3SFRzAScD(dHJ?E48|qj5Pm zBP$96h#zf}HJXLbmp%T35I;!-zY$%Tw>ukS~r?1o)k_~U=;snm<5v};mU)Ys- z5jw4Jz)_RKu{wN5CubDQc+Q(Ee{}n#1NPV-C{3Q+Oq04qZ>a+OU7OQ0bod<;^cIdQ_;(%|F{dQM9Q<_aMOKojZ*Jn(w(s3L*KJ{_%rFL8@Mx~8ytG@} zbb(0ZvlgK{bfDq#S~LwOCOz3LiyKG+gWZPeP0E)9BhOfn_-%r$JYoc+cygVBHGuHzhDK)sT8wnXzx{-sq0W;UmhyPi(dq1I^JsOlF(9~p{h4_CSp%2)l_%;1 zKe4_JgmT~*3a3cD{Ll!FO_H<&&SccF!Rvi-yO{q9};hm!g|$MUDD>X-8RX9D$?*!th1E=<1%YX2#=7&ut}s@O_alXP4c zgZnl3Ds`b#QXY)^*fF$iwjxirKZvSYSXi3I!>A**7mUYAz#6$bM~@{FwkR#%j0_WT zEdXTpgQu}=&T(&uz205majcGx?+N`cV`LpZgbRZBv0EcZUUC5&$7@-?o3d&@gCsl$W>r+>^2+PA*To*#N+7m{q})JI!^`Q?@o87DD%mLaRu$i@ zvXrcVU*l0|Ch(14?)I-U)$XNcb|EA>e9gmH?;LtKVAQJYs5+p>8Q5fqU$sqM5YNtd z|45SWhSI`}lv!QxNS*pfO%<;oQgxeK`Ld~A^tHl|Vx7eFHo|{x3;V)G+IUJVVgc)t zk_{tcvVMQ1>@3Qt*^0)FX9t|i#iBxSqEg%1hxePo8*8i=cs28^YRy6{@hD{v)7j1G z>4e3H{rGDy@cF(Cq3G#4m5;=zKj&e=7}c|Mw?3X)mG7OGGFugk>`1k%zHTzJbp6O8 zXEC2uTH!rE5qMi1ura7<-KqbGOprJ>0`m}4u^6^1V~~H$9uG5qw(7)GQq#C=pj*F& zoWE2s)6U*knsX~lCg>*0mtxn*X`RzEHT6IiNugLPrU6%usxN~@ao(+)o4nI`N!B_k zv8o1&p11AY_BC{Jtm#~j%t8dQNSQGP)XMCQLzPqI8?@xU0|7q1w(OW^f*T>@Jz^^7 zu=MO0Se>)+4k>Dq#u)4+RCAC{Zmj3VfwZmeWTG2CZ=G3ABSswqciPE!n4uJ&S*;aX zq^{0xN0myD3guEvw=EzHGE#l0wJ=BPyfZ()m>g4dege_C`j!*omF*-nWj8MMCyb{A zM0qEgXi~`9a;0X+xZy@HrmIWGD^2AUu4Cgd$GrB_wG%z&wYe42=mBA?$ zfiBL-o=<(;9=+V0{tWtVO5Ohj2}An%MeBAE8;=&*3EqSyhBhAAJ?Rw~(0u;=wbiH{ zT>6IJnFIFif#-Z5L4+GW4=jit2G)5_0dfkP#dhCuoR!!`q zLKJgg@sxn-yr@j{c@5eDkOXciArfk$v|h-_z^zs{r(8r~5G*07h&Xw(MAiU;u{G+k z2Hp-bf{2g+orcF=6q6^V!yu%B{%#T<9i1U@z6gqY@^~ORTwFwmSR8(L(vOv38+{lE z(@ep{S>x_lwGywI5l$n9C4aS`uX}N%ibEs|16PN4w-a|3UG8q(KaJ}n25qR{824`b zlKR|+)q!o}vbC;&FTr+&lUs`u!?doWy6Mg{=;(5?Src_&fuA-Mw3Aq1XedhjZcY~{ z<6VSTuDjaaPR}QfUQ9l2e9kh}I=;-Ro|h;joRug9SmHCnkxuuxaA&xDNMca9(j0}> z@|%`j$bxtP%BL@cxQoB$Bu=4`2HpA5z&y;dGMYcsS!tN?TP}CEcr&tH_j2hSHZ@9v zMId;dm6hKPri3?Yf)=!t3G}IF$J2R6APMjnUWMDCb_#}{5rj6at7uxJYSepV0;|98 z5aIh;LBzsa?T^{08-KMGeA2DvyeVZ7TBDxLl-yXwp>p56|ITM(osdN7<&Oiaw)P{f zHY+S^a|S<(Y*3gAA1}>Y1YGcgq?P+(o0??PTBbvr)qJX-7C*Hxa90j8bK9#d9ofZ< z_j4F0roPt%2LS;>v>ywH&q>oo;aXOkSw0$N+G0de_=We{syHD0O8^YYv89OuOrabn zri-wDWA_LsYvuSg*8v-FrI=e3&s0@q1stl+jzyj*UY0}A{f1o_lt!=-0~9aY2jY;{^KyyDZ$C~FET-(i!UrN73|b;vB|l$mMdJ9 z_pQSykBxAW{Kt@+H{Su-y7_~DPLn{D{A5XT9N>AMa2g@y1K#7$=`XU zC4i~>S-b=Z=G(GP>Eu89D6GzuBED+4s+{C+%1NBD;1g=4AbPA$p>@ERcGOaHa`djF zyt&Gsn47iPAzfaH`{?V7D&Wf_d~8CKB{jLweR9H3MmTe-3l8C1>CeLI>Sua!`b-2M zM`S-0TUE9;7BiYy&E*=)=2*HuF?DAC>Pxokp_3DH;UWhKTxEdKaAqeopcDbON*c$! zxvw=~zq``UdxV9=#+w&D-he9XzQzD4h!YF8>R)lHds zJ?>AsJQp`r|1I-=1$Y0gz5Z0@{h@;XV_Nykv-&I3N~XU*ZuIY`d;Zw>mrb>QX|>|`#1eFu*Aytm!Bf)`kQWJMfj!L%sc{yk$~es@J|nRLNDY+;uSN@$rPXX z65|F#h)@&i_aA3m(V^#%rnuH(JQ4ke4C-d!p>O&edco1@T3@n-=ybB7eF=h4CCuUT zhxk_f51~wV#Fy)}eG!TRw^u@wzl0cuI;xbhPeqVQrzhw4kyYTJ8r(&TC*EqvFS@q*dhHT?nDX=_=wq8{T}*S+S(qfio=s+!YV$_uQ3fgm;ss_ z&N&o=o>Pw0GqyvN2KLXp{is)uq4z2% z>y#4+K@<={rH=2LZOle=sz4Dur3IbJ&DisTv1#3rmLtN{*tsD-xQ5GO+##I4OtewpiZDi>(G+ zdaDHNHGici0X?(eIb_!1K&LK#=th>wGA^e)Hjode)@Eux1{n>%2K>P%m z2t2)pAG4aXFm|N_{6qkvZZfrjOJ{1!e?Dz`TCf(#-3Yud+;IaJ`cuefYH; zwEl}y6EpQX(Y$=`0~E6Y^AaY&L=KU+#Jao_q2VNreh2W6>cgPVU%9I7%>!3EGBe9J zH#12WENQyqEbeB<+L5}T>pp%xGI;ZI-7MTqnUMq^Xawv0&VHCuqKO1#y-uk zAHXm{M5v^I2zfyX*4-6)1Zh}hKlYSGR%mQIPQuoe4qIy!Qf5gK@abPHjTKHcNK-;z zUOR2vOSI>iEhs*w2j!G2eB z0LKH(X;Ba6And~~t|(Xshs3b{Zg+crV1co6K^)>KQ~@_e!IowYvCa;BN6H-KoFgfp z$*&&Oe`+2?6zl9pOE!lG2R@2OFmgDlhjVK0&FT3WR3Mso4iu4!C1{7SAKK7zw3!#? zfu-s$KESDYK9T+f9(nTEN}1>~n;mNav&8qLSYTd7L}9a3I%oduLe`j@?doKiV8<|_ zH2P}t=A(s=f&{^z1y)*%*tl0k0+_5%Ndo!|PF3lFZ(e2#0WrGrfr`#(UO1;s-4H7| zy&e99>x`O(8x{~%t^z}cQ)qq#uF%E+GD{7ROhs4JY9MbT(UYcbd41|D+S9tv;|~}K zY4-L!(PnwMr*c-UjQ*Rid4mY^hamjc*Cz9*at+_uR>@`>WuG+QKh%_pEn9^f@Hmxk zIx!8Zd6m>XM2s<<4BoM@x$eV{>uncaEN#T64sq-r^65P=pIxieEUzrz+TvdhV5mJ^ zKYE&IWqJ{lZz$ix#-I77AGbkTqv)a5`anaWu=t9}8$Xk<-@ym<7_Dd1r1s37Ix0@N z&K}&*Po2rF>g$9(G7qg=Z1Bahv~{?6g>)6^4m!Y)?Eq8;21rZPXL67lb8q@xSHz1l zO5TX(;i1(yJSp~^Qx+QG@crrOR)#Z;-n$(=a_*!|ugy1}5TD9EteE*OxWQPHAuD!Q zSTn30A@1U|vq3!xz5zp*N6SFKxslC9_5fldZY=!?uK&-d@gMN}Ph9_FDE5DZi~bwe zzbAeEoi6(SiWL28koCLI@|*qg*UK=>KSil9H-mzDCgBizy#JL9eHxRbFRC;cErSE z#@N>%TX~D#Z1vThV&{TGKZG8cc`L3i(u z*aJ&;7(>doXgiVwh4orrAn)eogSj-B68P`|oR~cjxYBH93!7Zbgsv7cjkde>VQeB= z?i8pxXcB__kvD6zfa2WUSgH}k%57|vpJF0!>xAD+(oCO~C~FQE$L!O`LzX4Of|>j{uUdNr!=T#7x2; z`NG!4oo2v-eMN?0lYIIfw{a(*?PHtvc+R!`ER}N@Gkt45KoRxdoilFfq*HG0L2n7G zW@|HSNv_c^kX8ETURGBRC_XDdclH^a>Gm<5wo9r43d*V76^@h1G$gGW&RFI<7f!zy z?kP0Xr0)&}G#$0Cl1XGYbSC|bak6D0(hT&!YU3G_eYRsElkQvCEutmwYk^R8Y$bhl zx;Vl5gy!t##{a1-(%zNQ35|`vqopz%f2@sfw6a_-68d${NPEVX-a4?foywpXl5mE) zGb?xwzm~qcJ#8Z=WI(ilu+wre@-aMvXk+orz06Seg9M)h;W>1_eVnzj9UFt(89VvK zL}TJ!@1wj*Xu59bY>?OSUY^6FO*04QQ&)DG_DGyK=t$mvzANrK?k7GMeeX4`4Ea-- zZLOnM!SayRCmRH*;cH)i@T-}sj=`~R<@ z_;cgUG>Zc5{RHCH4UyGX<|TBFkWQuqZ$WGIgh-FJ!n1mEjrq_W_H501Q9!8`zgv_ z?YR)wR;#O(IS}JFZL%R6EtPzP#vS3sIdldCRvK`2nYN|F_P|p`M_NLF?7&=Men#F~ zAb~#a*|<16or=lF-cT@S?%6Ki&6E7FZd)zGCy%)XWhF=DU&&3lR8{{Pk}!aL6p8G{ z_H6^@5Q;sdJ4@MkUV@RCzwz6Hs^;7pg*VE|rN*~JgNk$&?%8Szb8kgevEw@GLVqo; zWCu+nSPAe8T)3lKU}BLv;fqa?W>AP5Sk4>-)oV6_dMngH1?me&dd_2)U$YD3nbKrG z1~Q`NWrcI#_53`R96L>xp>hx)4*$ZGC-x)|`Uk>y*!hl}`P0k$DP@UP!I%6ncbix! zq9jlKS&f)5WHju=V6gMv3&e<$(+I%LS!1Gzuk8qOgn9*zqDBB~)#t9Qyny-mrzil} z&XjhUMu@Z9+b=uqTNsCFr24VHf>H1`J2B$WFZ&?|veHg!b*ObD4je?FQI4Y))A@ts zgPR{1bwOlhFBqn^;miYft-F_Vnj~w55YHbIk}hmdaEP5#sT) zI!nSK{?a>@4pFN9R3li|~aWh&=MxC}OvO-3= z?LU+K2;Jy*a>#e$QK;_&OoJlXT`bXm>R#0YRVMrZ;Q>*jWG|bVE?H)~rmZe+U!^^2 zxPRGXefhb$L=2CXWNT4$cEsW@gT^3OGh z=EA^kMV7|pJecDn0i986}P{YV&S42dORo zl*GfKxk}?chcj*jEaoa`?FUQBA~aH z`>PJP$fCK<(4HSZ?!Us4+gL4k)EACll5s8pxM+W4&cBpe%7{RiE!wf%R}P@5NdG}{ zS%+vfx!6r@7<|~jrGjyo;}rP+*n8`^Dx0oBS?3b zw1g6Zba!`2Nv8sWgmen$+8ggjpL6^CZlCu(=dW}4eD*MVu9-El)_m8RHFM3Tlncwa zM)6eB`Sv#LqA`wb_nn7v32(D*41cN0`B=2}6-v8o!eY-b+tzYlrF;9$(EG(Ad>Cyh zq4PV=e>lPnREk@CMBVby1G*|a^T(ixGsWI?0wMtq~~6DS%y{h&Y_6PqD16KHv1V}FI(jGd2Pj}I?+wu%2XKdQrKNWX^AHk z1yWZ(Lu#=urOJ=Q)_nCZx5>j6zJzicyYyT_-uXbaBxGHlL0w5IdrrFl#QKuv$GEg713_1-#y!}>@6X{Wz4>MurW2&?OZ@3f zb9GwEx;#yJFhaRV^2H}u$9#}rL#WO6i=@+g%;(a~t|=sfVJ?)3u%e8fp-1VAY0;K# zB^#^aZ@*%^P`f{y-Tyr%>P`<!Rc@e;Wt}`qO>V=|_{#K0%3GX7fM13CgRi@k<-NcFT^$qClcZngrd&NF8{! zE+LC8J)%Z(B6;)MH4Vim@MMG00CU0{MqiM1Uk?#>4hr_N#kaYG=F{Hl&?ro=lqhSe zo*2}5f`KS(?ogs&ajt%k8 zM?ztZqcH2?oAU?b`d!jgGrA$LZJ0IInm(y-m6g`Uu1WfBX48+BH&~x^JFn>D7aOvd zo`>b=j=ZmRTG8Jpp3!^}MpZrZ?8#Ef9d9@dKI}S9BIDh|`9_!SVZ~=VOYHB72mF_C zx6-O?0-lDSutQCj`q^(PD8rsH2AZu=Rf6$?+NL}B+%K_t+Ky%tT#A@&?;bXEl~E)e za1Du}Ury#QY;z*b+oeD!Rjy9o3sJzjVxhnB)ajFVchU1S6AjWTRo-_tMZp{;BvZ=i zRyL1+zN`D7_2Sn~$Ta_3ah-(xj$!Gtrl4_ICMj>45Lt!L_T_Q7tvWpV>3U zOmDc0ylZH=WhIV-&M*D8hehRHPI5Gk6&)sRu11i*aEN_~Z1@~a$yM1TO|V@t4lb4? zzX`LR3m2+kcjH1EfUnnEa|x%5DaRorq`6A4tMAr@4V2Yyev5k z>eEJbQ{{Yn1Ijd!Hqas8mO4Qi=lwRE=0h5)^vxrsrk>8b^yrI&kpl{aKIqRE#RC;p zN}a@K9+B)8M9mW4?j8={A{M(Aq*~;krEKN-M^2FXzp*yd49>4<3)bpd?KNh7}+!s3VzK!LTWrAsI zH~;FOD1v&V;uUFmt9%KB$obvZWR82GU(r7IOl+U7>UnUtq|~fc`fX9_DaA7K$qZj9 z^X^L#LA|OZ=|r~rEGQVascp#fW7$mm0JgLjCK$Jyi}hpc+>Sght{U{26-$Ck*5+dE z8#4%oeKN6efOL7g*ZKX!e8JDpFjA`Wuu3s{poRb?_-CxU1l^2iFIJ}dL+kIOp zI;L`k?8T#${Km&RlC;++K5E1zTxs$%w+XVz?CmiYe_2G+6qrGJr3!njH5k&`6qr+< zH&B9CD`|apM!ZYeKEGyi&EfFOsXpc6?>mWP4t9(zrLxuU8^J&WrLL*2P1mnH?33E0~veaJ++xv9#&(!>#kWqQR6 zs5LXc@w`?Nuz@pXhhv1}dl}W5GFaYIdV$>P&38rv0r)M!X}bO98cI7qO1>7;3G_zF z@Q1q!2c>gZ$F(%$o#*J|F?1ahq;`v@ydv=^gQ-_ahK7hX`+KCnAFY0ohTTozxr4Iw zEz+kxBsGco)H)vO`$R#^T9aE_C?54oPg)UE!fS5w>j=Gmgi!9K%VXXIsF#xPB&L?8n zCIhyl6us1@HVZk~spS}67mO+g54?hR(EF~CX&xy#INU5O7n8Q=H#=M6d=uYM`y0jd zt5@f@8$MvYFqx8iN=kC>~cei$9g}#J*l?eNMhIgRV&ETau0;}bD zHKo<%c1T;c7f{U=eY{m|Z}gcRMh6+yO?^$Y0b)ozBO>)b-=~7T)H7(JdxNWX^#*wQ z9*U*)u8e<-)KfZ=ucV8e7)`)VbJ{1vT`CJr@yIAAe$859^I#nKt>^X8@y4h)9psnN zXdUHF37@~S`VwK>%U?26K#dRCZAW>#MOh3Fk;YBAp%&HJdic0{sIB78FgjjwU{2uC z?$GH#H>0umw*O>?Gq+PWHM@Ryysv&g`#5R^`z&+A0hb_$r-6@15oogY?8aj?#lv{L z1KO`tDXy=g>WEDvNnOw%nI6t&KjIR3=Q^}C*$^>vYO+gie&d%#yo%W>LR+QawNIQ&X9BV5?=|*cD0U zfGNWjgTz-iD%9*@9XfXS~}r6L~d9Ek8>8*=>;OBv#0THzQs-l$)8Wx#HTL z@-YkjUcS^v^S9sujk&F8I3hB0s^w7jipuCaePdy=-t}T+pN!EUA%m*nX0+#NjyYyb zc1D%U)y;4kZa9~>CxbM$CG}@xXl?wp=(2@=>cHewY+F=2xaB-!Acq= zT(HOX;lM9o_}?b$q5iF@zjBJJ~7`N)Un;4p-&>j@EBNbBXt zmpfh&Pb_Y=bgaL#DGgimQsOkArDOM#G*&(J1T&qR2oCd!Uf%z7vtMx2cTgwl{u>*s z&c>WaUvNW9s&Awy^FO?4nB)=(&2<36dy)BurEqJK&jD=1^72SLES^?S@l-skaenEm6*k^dUAf89L)>Gl7;PwiLC{)xf=38()En<2k0oc@K)ynpO# zTmRR6#|1ExHgO!cIVq4}N5DEC2|umG>$0KUhOn@ftMR)i56#P6>#8xN!;2OQld>{3 zF?0)2>}Knxy`2pg5BrY7>p`#CLS_=VHy+3kGsYIH@;$U{BA)lU#=z#6D6w%me+D|T z-m073TMCkV!ye>!%OhRoAm1Nns${Bzo>{ZOyZa`cVX6iz2n#O$OhJCGJe*`T@9iM} za;W_F8YZ2*bi+bSLP=it)YQ!T^vd(@7SCBHrNwtn1>_vPu~fm-U`zD^B?f*U=DaeVUX+7v&+iw_9Op z7fsy#S>yUbnfCNGKjZNjMup5^AvWtwN1^P9ZuO^w@k+rea^BI#Gt~nDN}yVKvM?$K z?a8KBv)B-N)6&6)>uoDUYHo?`g)hn_yQnlC_?p+Ed{OIo!d?tqXM7@0_%)PrEmNa@ z?TkYv*AAP0j1bF-G?v7RmipVod-pQO2O@c;Q@9_Vnol*68!{C?jNTiKD9`Kiowjkh zh8y|l#{8*nnZwKN*4bF+RC=9l%&5J2k1v>_ZpFll&S6ej${%yCeZ86NGGC5${+#dJ z(g{=P_~ZM}&*MbdXDK!sv8XSZ@36A(xhE)~Zqhky1)GbYPPpm4fo@awY_ZfO-)3!z zA(dr_?3Ik`y+PY#aWr?DV59eLD+cZ`?Si&tVBn{YgQw<~?1G_$}wR>Mjq z0mP8d^j@S{w|u}L_Y(VBL+%T>g6CA3pF5*(KlYW4&z@Yo{(1?K?MA`EmQi~L9r{IWbF8NW(!XizF%+pPGPqHpNxWHQ36o3C2M^L=5*hVMG0r1Od(KWrvqBHvZT0R;pFm6HH<+EqvPvWr)73_O z)NqodJJTQHHG2=~TrtDkt_zPY>s?mpmnLqiq!b`+t&@|MUO4beV8W?patnR@RZF;M z%{KZW>$n4yK82aPE|Rc;^0|ZhTyo6U`^g*`kBXBsDIVQ_!$vGBfkL5+UrM1UG+|u@ zKc>)>eKPlVpoje9-4RH5{CBU>kL{Fy0D8#9i;zE0V}XC&YW*jm|4)YZuL|Jj!Tdi1 z`rmquxc>Z<)}y~pX%)bpXS~I&8=>K|`%YOh8N=#knsJyNU$a&Z<9tIHi~l6!N^xvkJR9gkkd zs4T=O>y5h;EvYG~X_~#f4N|+-4(U&pQPU56b;hY*SKw9InckOO^!-Xjo#CqFUHJv4 zTvg(|_fOkQm{`NWxz?xXk{)DbIEf56o$=V+KDII$b{a6X%4=*`U6#izL#A(ai?jHS zY$7exkL|4tZ!`%cB{?vU9<-=0tb{#?ARP#TTGo+N8LhWk)ZfqV&pg-}-wlHMEu+Zk zbH_>>2z0%Yq9S_pwizc6?Imt8R+3iv zC!5sX9+zJ~${`3q(PJJ{vyJHqT}>M&-j`{bK}p0g_(-e-qi!8mj~2I;z}2t93k_1~ zmLySQFCSzAXPJ&&ugH5R~wc4%R z_*Y9ts3F6yD2>r{d?9(5sC{C~cH)MK4=aKm8r^2Bv-nW-4zG$PukPLO^MpH|k9pf` znfEdAa^;^a$1OZ_YnYj6Od`&dh40y^S!{7(oRo^u+pKFe;0IzxXo_jfP^cpWU>@(m_AFCsoL%mt18N!qKzh^GyTPDvu^_oZ49$m zj_sA%xG_3Dz1-9975hDVz{`tAW*v`*r~mfN4D0*APIs(gy^qd7+NZx}4J zyNitaFGxRcuA`}VV&RyAx+7rpS$6<^=mfjMn@iV_xEd`Tjd_30$(!W9Gx2F$x+Dkl z;_mT6#iNiBy8ONC71Lfj6vV3e z@hX$0W*U{Nv9XO=#G^^!NzN+Y&}>L(Zumc|#eAWwMr^&zbqm+R(^IHXu=5L%C9}|D zEP+J^wL@Il0Bt54Zr1~P(Nt}P-zb%T^!NZ5>?8Nzf4<2D`7@8t-;@fn-2cSm^Pd#V z&sD{rDV5)PcK$j*^v|B1Y2f@2(zBzLDuwB%tWbXoa$kOx;A#Y){KMVUX>`->S14*= zapOB>t}pEc6w4kni&gWY?`td7@Nb9A(h5h^6+d@gjv;Z)ukE-$^B6O=IX0%%YVNbF zZ)+-reqm%wIEDCBCq*B{LI2R~wwAAgMII&nCES`=>j%b@3FB)UXVWJ`cZtNGr56NG z=dnqD2#^?IJy!XC3Z8p*w>FQI_Nph?R#pKroEzlGp1PPf^(8}|h8XCiAKylj7-ij8?dKm?91(c+z(PVSsgYa#<)Z?<2coWC zdL6a!OSCxSfu})DZYzgpS=>=Qp4??c8=5_&_=0UDpBTPxiF2!ywUEjVBqazcu}Nqp zU>1K;>4G&Csy(>l*$i2<92l)F8fX=|hubFwdg@P6G}fnYg_$!vui56}BN^U~j^gJi zfS)UC4hgxvt=f=C%W7%Tpf-`6@&qTsTQS*!qkUetahUTFdLUY;)RypVU*B_kUIEe^ z$QnP!rOc%^E&3NRGnzBgTCN@W8=3T4*M-R#AHEOR zpURNPSAA9`15G>YTdPo`rsTnkn`DSNFtss<+RNezkiYq0FY8|=wc7F2S0K<+I=lbMB=#n&lZa#qmgpK%ge)o0s?xUdtYnDbtu@JV};K#flGM*Xec zm=^Z!_o#G=GNTI$jmoW$7kJ6u_G<^?xg^Wj7f7Twk}oEKuf5>f?D#^5jaHQr_JFKy zmHOVHcogppYRcZJnV1R@*+$sOq86!(KEiE zxn|nRvEy5 z0}MQGD1;eYl~bDxHJv$p<3LO@0tq%!fg6oZ;ow%Dt~@(?20bsRNV;zoK$aWU%jz2S z!O{X7U%&e{DYbBy^rM93T44|7M{vfNHtsP;@koZdZC~6C_A(Z3#ER=F#wwfMqzcy4 znZ2s!j}6ju!Q898y7oYlLgWzg)_;(lV~nfSWafD?v3ES=(J2F$)gheg4IF<^U|;fz z1I4`${D($%6(*GTs2Zp!dcOwJ_brcN?_*yLM2`=izIn7ma+BKrvCgNdZ8EQeO(;#} z-gQ3Qh%cB#mD@Xh(j*dmj7m4Y-(sGW_`M|-vnQl$!OChIBEWyqO zt_rwHv+`&O{DPs;CiL}G8Z)y)jo2{Cs}Qt|=vZ?RYx31g^);P5Omg|@9SSJ%v{S>2|CtuE4~Z$qa!#NkPQl!Obutp3(=cmH?Mrg zo*+W*_A=ApFq?_%R2p7xs<4Gp6QJ}wleQ`LQv|rq>}Ju-vwy*hneZ+VJtC-g>piL>ilXrSxsk>J8n+jsIC9tK~{UyFz?>1!a zHXketd&V#f452L?cShr0){gsH`hGYxhswxpo*)qWHlC8A86)qzV(V|L0mNyJj0wbx zcXoqxJ?&dPZ#m*V6_Qa@q`Vc+t72SvE*|KCnRmrx-?w2_@dtnZe7Y!W#L;pNAY5R^vZx}QhkCZ`pL+BPMtxnK8TA^Lu0=c zV+H!`-6V;KiYN`vIBUt7udm3+==YN|C`EPV@m|I}C?;D!o(p{{;&qE7i3?DCCxeA$=6$dl&{{DP~AFm%FE_(hc!zBGrA3ecarw({;@d& zKm3r$v_Ol1T4BtR_;clCSO~UcOki<6$^*9En|}vq=s)^$kdXFoz8v6E?LRpP`*(2u z-}`d@$h?OBx|I0KIS=K6|0xJh|Le`VFF3Z>urP3hRwHS<^Y~v%sN5Wa3VtAFDomG- z4uzW-9#2*WVzMacOpPUd{t$?xO)-XTSO3J1@D;ic+_jOgj(Lb8zt4-NB9DaS2G&q( zgYw{&aH_*DYcC3djGac#wfy<~A^OQD`F&F<#S-w_IBxn5{k9o_aN3Z!-_$f8B~&$8 zHOyF#QdhB!NP*8oR3joXyl38We=u~qhfjF7^xCT;pV~92c(!eiFC#KTT^2{*-CsV5 zlvHU9r{;Y|Bsk4PeAUV9bZNbHai!Jra}oaoTfR#89S_~D_cGgSC-c%QF)L<5+1po~ zjYfSLjdBdhlF)iCp$aNSk;!jg8@T#hWedj^eg68WwZQ#w;#+QO>xt!?S7`fvuIaPJ z_lB91F^`iZk_e6Ry6ZEOkUDq@Z|2?K+8Kf<*v(wI!pd6fcsGQ>{EirZdxzRH-&F1O zrq|5#DM^c*{2beNqvLE-u!6;Jsns>)w|}%!Yx2KFoZGDfb4W8KrwC!4YRjwl)toDg zhZE8?FhXj4tTKnMbm7Q<5VO&qdb2B$dY)wqog6F~CNs7VJt?!PTYJ4(eUGwJvY~Tj z{qus8i~=_?DpLkt^{Zt0HjBDO$P1aGoP@6{hkIL}w|$n@7mszu9_L}(KMHr`m`tgZ zBPo|nwhei7|FvmI+=@JzA&4J4KlpfKtSUlR{ID+CQ?y47jrhR_Y;TNPOlCMIqLy{l z@zail(_WdC@BLz`I92Dc5=FAw_({6oV7ZfEPD#A#m=~aO2#NYQoyPe}fH_Q;YeKKs zX|1)c)_&dr*pO*^DcZo%XW*#t1$?u>jlugCXeR#yKB13>hD@MPlb9Tu-ZJ>!r!$Nz zk9pC)?aY$2*o#tr6MXR@a_23_-IBX!sj5M8SY4Fll+7N3 z&0&KQmquE1<V=xC&QA&i#00qAI-gWvAHV9P+RI__D`ar=DE1}u$!+IN82u_A!Om_?ZqcQz zc@+vXxsGmJIGrM_A~EF~UY*zx4)SV|DP+hkj#whh@v8FlF{36_@)vv%@qtb{Bi-og z=#fi=3Dx9j;IdtyaeG*Sf8cFy$B8!+X?+IO_ih&MIpK1NnA1bA#Mh&w%|2D@Gj5gnwVt1Ne_8{SwGXu2%IHK5U; zk+&55&3}xuikNUNQW!sZ-iDX&0~#pZTv~_(9VJg;m;^l;Tjh#GNEkNP0a(A5R&){m znno*0o=DvyZzC_%V)JFi(Q}8rWIAyUJ1G;wCswbPy7kF3$39^Zq2jCeZU3 zrm>f<-IM)pYemlIW{$k=eNroQ5#o} zwxXZVB`kjOzY%27PSQQLqe>&zdxfJeRjEd(+}kuhwu>8d==(VEniff;8=T`t91E=C zW7M^4+Wk=zdNbCoE22+M9&fJ5%#8pG;G2E=&am{@wpnAXw%dyp)pF>J9HnxD_%w`{ zHHA>9hIJa{ALYQ`ROcmReY1BZ`5ebFDVZv3vgwiWu}#Wa11rP>?DDc7d^K5fs`hnI zCWUZly+l67#5(~jjPvZPT(bsS6JBsXwp{@hL(G=b@M7z5Z|^)cZ&_67d6EoB1Ddx8>gYIjPz?$rR1V z$G;=2?)&^I`Ow(6{!_qc6V9Sh_Fc2Grl+GQo!M5VH~R4J2d0^GwHt2H z(Kf~35X#Rce^O?>V+*{!f5ujQc}#qv);mQ#koNAp>O(Up%z3oBl3;$!DZ+1aXKtwV zLoD+s6awCr^!nar_d&_j*H`;Kw3O^Bdyw2Us&f9mv^aSq7+>x(Q)ot|9^JFD0nf%; zPF&Zm3wC?r&h5SvO0rHRveK3?pg^RpTV_(9NHkAO zfg!Kd?VKr$y3B%R2|*j;}~jPA8%^8<~?DoegB1RNBeudBtQCcah1bEjoB%~=lenEL}(A^aVre17KioLQ*(j_IwAliuXJ zx^Yz|m=2^CGONTxk)#Cy!A2MlvsIE}&g>)EysIYo@k&jPB|{)lOZ#z<*uqGIug4>T zmYw4|`s{Sh&q^WWG44nkS%A;gR4IH9fgNkru?6i2<4YW6^_4pD( za$iZ#=r}c5Gw2CFpk5YMre?NUs@KxwoT=3s*f~9aaC2x!GQvqIXh!A62NKzoq}-L9 zV}t7+{rkZd@Xk543Ul)c8DecvVBsrWx)irn(g4kO*?%hb?BOX{syhH3*Ld(N&XPtYkzEu zpFApn-PYsApuZM(@3JBrY@;KzW7UR7p0EJJe=W=lFU)G{>}X9l)o@%cLZvROVZ&qW z`~KZoHQu_Np*YuFy52rbO{^c=7d@{o2a0ia=o%79X%gM&Gn+qM0`@6f_ILJ&yJcU| z(BRg<@47wJSIeizLO<~A*X>Mr+I~<3o^OnSJp!iC)SGsn&j<1J0tL36MpBS@K_F10M)ZARf!^^~Y-pK1&%Yv__FrJ=0qrXw5|D?%0?O3TN(=H(c zE(zy7u}pe#&CeRbq9{yKB0j!QZo)p*$c@<$-=TRUp0jKFY`dyF1qb@Gvp!OpS)n{G8KL6Ps|&Oj+wjPbOK28_##0jS9A6ibb3Tm24;Ou3X%}>S~ach`LORCsvKblXKfzVE-ygT^;hpPm%m~#F9@0a z{v1+SQI#y8FIiU7BcJ5{bYP>YCQv|g<1Hv%U$}-6^2i?Bj^nHH+;Z{}vR@5|?cnsZ(n;04-_nrtD z)H2!mDmnMbIXJt}-mT9G!C*_@ZT}cdhJyQIz}>3_-kW7DTvL}2WVpH6_Qltl*pR6t z=bH2s0mtNywno>7GBC;{-wu{V>{OD_F{c7{PZNqI9gDyBP9X=EP}uXWho9IUkXg%P zJb8Glh#EcY*4J&^dQXP83`3UQA8&?NKP*Zk%Zyo3Uh0X!S?DkOBA&uV_i#YPZnr>5 z*}S}{?bhScu52sCppdEHV)<1SK~O)qLUsyU20Br&gA(S4^>F3^{4E8nlT!B~drCgo z?fnPw@sBi9BB?7V`Zr8a_wo2uKHKf0p;)O;dg5oOXy(fHtS+}KmKwXWwXlRvcoMt% z9p%}YmGa2lHk4i#kClGP{I$NShncRlKvCD$)7uw*vLW5`)cb)Cm+b_{fp~QqxhmVT zcS@>T)^MXX>Qi~Oc=DWHqx=ElZ~B_=w}WZUux+xG@4o3wW1n2U)I3V5e`kqg>dxwB zGp&eAp{1DRdp{AsPhCrvO3rJoVe#4g=;rUAa@FT_1&J4I*r4y%62)uZQ!-e3HUpIb z+2^(>-tw*`C?_MxCWi~GTD*Ky^dw`FlQO;9DZ-W}q(mN-pEusoUHstLK=>&I8%811uBTJi+9-2KESN0GSwaO$)s z*OEt@z{4Y^jfseD^`0<&YEk~J-4PZvV#S|JCR9 zTkuCh>A!>jkL{3u0Dl-_uR-yb-=&BCx~=^GCiwr(zsAM;U%Z%baV81@{@Hpw&H=hF zBFI>*+RRD(1tEeW*O+uH_-W5O?+hhsxdsZ z_6cE)Lu_@gW?+T^S)SxZJA)i`#)|ZdB!xxxUS!b{z8*nBVbW5HJcw8v-B0AT`blA6-Oz~M8@v?D1Hae)rNMuH+eNzDePN zk1Gxvn$$Cz_?}tkU}8f0qar@x0xHb&HMJwuyKhD9(wYL4bCgifzDc_i^jP$!Ru0yj z8qD3WT7C7AWgl#<(fa*$IHzA7nicFd^{)KOs%q+btxK8%h;LhT!;|Czss*7m48>F+ELL&=SGk%WY*GAo}W?SptCB# zS)oEV^-WD?B`K>$gNgWcGY8phbw9Ul2cIU{tk-B|11A*GmN(xH-jZCU`k4E!q6{<4 z#*K_ZN-5cD(3m8c_)(E!2_75mA~&g@vZqV)O0K!*<_yVRpYH7Q&$`8}kS)`UCJbb@agd~f^STUx zxso}^izlmB@b%Hm?7sFMyfyC}eV@B)ukUH$0{<*?B>!Um@bx9h@X1&%|0(J(?TmIC zrl<@s{(Rw4GiH^WM53z(paYBu1-caf$N&=WEaRG4yzEOQ!6^(93RM|L zssnD_V7Aj|Hk;fcrcBFJetoPHVWTe3c6U|(dseMP@kLaq0QXPvU%qHKJ^vd zJMBclTlgWaHi>cIz{tpYCXSfg8(g>_iBxq!tY+uO?sBo5E;#J3*|!!!!^e1|9DS{# z=$!nq^i?hQ1jB+3&POHZnBQVfwZ24)L%sF=R*4QBreK<})gJTBFR;m9Ecd6Ll|R~I{_lR;4E7t(3LMzR`D4>tMb?kma@BpQt=`36DwfBECzlsrGP+$)A4fkV8DaN_cJ;PYTZ=VWvge)n?8Pw&rPBo zf3a!oyt_SI2oZhnzpTKnY3$`geu+7Lvy$8vo&8>E{&A^1+9!?E{YIkq9`0m?qS$tC z?P}oMS(*Jay|Zke1VO6=Jv4zBbq0!~&)0F)&nJo*nni}UJyHToZclb`(XM_~)A=A` zaTxz-?+v5;Vj~ktcY5OxaL$!+MD{B5!&S*yzd7?6eS>Q%FoMBwYKrtOd|}{cR%J`% zR9~0yni8ZLKD7#J%FrEbWY31dxj#dMS!}s=?6byN`blB6^vKdG<23*#x?col0%NWjOsZ1 z$u39sOTPUgL4045<}3NSHH3IXg=eLg;31l&65(W~r$ndrk5hO{@(uaSY~*}<`Ovj} zt5)BjTm$1Bdjxb?J@|x~-_Y&ko1DGpd-d{5k?uVkl~4Sp-`KBC<0^4vJ$6%iou+?d znVc;{nFU)UoO{u@j&}u-l^FY1S_xu#{{+smX(==V{s6|EM--+;T6bNaY(K*Pc z1-?qN;4$Vfgrte|S#jJ}N0}@CSn<71yZpK4?TOqfcUNZhPS$8m6+hw=e+JI>vrlaW z%X@(?#Db!=-{OW(DuVKsVlq8m#6-9k8x2<U@ItaAm=gchev*YVP=osKceV^a2vm~N{(VniUv%0BJOHIhYdom=OY zaiy8^o#;aaIO5BcKkkq%b>BbSYkE2koh-Y0)7)6|KD-x_e=l(h(JFtod4JL zLw~mP|6yg~X~21)9AE}0n3n^@00%+{1C$rc0b_tbc{rd9a2{@CoQng_0E57RJW$}6 zBrg}3gNFeEhXA=@JX{>y3~(+OKm`Wk0&;WnK*7KRIFuLh0L%@Lfq_8?@=zG?n3oI6 z!3$If0t!IjPy|V!DmVia0tJY2b3wp}0>Br59v1{rFBF7G;X>5@pTdjwUxZ*74?yVe zAq2z?P`C)e+#p0AWXQt{0UC--e}dpXpce38KP-Mc4KUCi2m=_(h3GLD3UmO>%L8-( z!p()~0MJ4x1C*NwpbUZ{#tO{C3xp5|f4hS^BQe>VV1AGxj<^gkqfnfl1BcvKBI6qnR0tJX3FnEB-z_<}221n8d@&E#Y%nyMeTLrwW z0s+bZq5=#!kPmnU)PxisC?He-3qVi=v$zoA2L`4pkOzhkKR7UP0C5G%g8)(H0R)j7 z$ju9sg^0tDAO(mjkdq4m z3=kNi9w^{sg}@NJ=LPCP&_;?h6b_Vu0_niyg(IH+8vZ(FU|{+qKmgz>&;y`V08k>} z01lJ^1Ct*Jk&^@rPz3TJISc}N2?hWI;5fh~5FmAki3mq>6#}#z;4M%y0$>odzyL@9 zasu=dpbm^4&?0~?Fo7V5o`Qj106gdAMNmhAB^cl~PzvBNF919|05uSh0`!yzkrTzdo{hyyAi6Vnv^ZiWytG=HpzhwTI2t}&%i|}XaFIjnjE9((oe~!=(LlmLY0Fw~- z@Pc3frd)(S@C88Z3qujWQox4$U3g(qBAW@AJAgJqA`={_?xF-Y7dIRz$juGV0&pKl z|BE&fkKqXO2~qDw?u+=(Twvt0i|``H&u5^2(fUtq`}6c4ZMr~JFrsD19{gfZBEDbr z6$W53{I7ljqXKB93(N!T0YGB`I1gCDfc6EnA@E!55TJ)}q^1FWH2}aqZZ5zw0+Ns! z;DF5ts6;@8Ac!O4aKM%X6coS?7@%GNwFQ{kKx2@0J2y9QUgRQr5kldJk-KO+qMjcy zB&UAu5yGrR=m}ty0TD+22M`uvo&4l4BK1d^i&VfU1hgY^L@v03EQh3xj3J+cAxPsE zC;{k0B(HuxyO0D3GT)C7F@X>ieoEnwr5CVF;RcofNE-r*92zLn#zNW+$Z@@R2K!t5 zhgAgzbTjZlP(gf(#^{Yw8L1&*}Tc!4FsU+w$L;`#9$sO@L$ zqLqjozuFZ)Xd`=ve1=?-Az~L#{x{)YtwH?%VRr!|4D<>a{uni&mk1*tp{)@z3Il8@ z!16-cRZ!pxU4#H4q!^5}KmZGh3;2e#NDznu$T}~w6!83l-bKkDw1MRzVyW;i+K61h z2LKyjztFd#4DKc8I;#YMi05Lxq2(fr}T!_(jaW*@+0z~uhlg%@;w4Pn4y12J(B(0UPG zq#&3Dn6rSXhcJI(2+;!;)qwHOgE0FMW-emwhFn@BbAo`y0?;;KfdSwKKojUc444QA zqYC-_2UTS0A8`PZ060JzxfeD3s1uo=7r7?>H3ebd0vBWbG7^7}|C(|^84R=WF)Ph(N0EYBM*e#tZF0Ns*FeH06?{bNff z2JK{-IW-VKNG8j2{mtdf3~$DbkxVD<==Pm_cO9vX&b}wy-LGl7{zP8#ZI&przOIG- z?PnItqV3}S9hZp0Nj~c9VsY^leE{+BG>3=3Q?D9}J(IdDmGNx#vzf6)`*%Y8E6hqM z-M(_9U$%8_8Cqb6*_EPl6{5tBRmQ<9u3km$2?~0A&Rt@^faQla%_fiXd>6&|1;3IZ zoaf35?EB2J*7z}@0_R6~Dc}q=E-Ndm4`=I_iHab$MPRH6)X#1lQcOu-;GuYR%#z}QE?=pdj-K&ti48^qb zvLm9#@8NL?RVZVWSFiGpRib2spePaQ;rrARXF2i3p5^Kv%bqqij!rhtpla{mX&xRO z?AiT9pI8q1&`UbE@Y!Vb>-YPu=hxsjZ@T%X7veW`3{MSS-nhR@Som(d{+rZ!5}P0j zUl9GLb`0&)ubcI=yFxd6T4ws%c0!M4*$s$DA{0r6(vDz@=eNDR*9B2#Y|PkD_za*o zQAkMeDcn4Rugsm)Tb;c?JJ&fce|W{{XmgeFTs*1>RE%x;J+P&H<-4!nWIeOz_N=KG z=HV>C_CEcN8D7dM=&UNpEU1m1UhX_OX3iq!+_m`pQPlb9)_FadfAz%JX>R6eOyhYd zosp^Wrz4BNP)9r4qp?f8C!v=LPwF$MGS1bFbY4(Lp65h9M}2AL7nW4n>l!*Rs5Uj& zJS;vi*gCeLCAOQ);fzsUSOQWmu`fIQ+JyRno15p1e!9Kys)p<1+kN!4#~M$M3l+~3 z6npx{Wlx@_qa-D|y|xUZM{nzC!}?}$tg1+&6k2ac-5_FNxVb%#cF3@d&sA*i zagy_9%?t%AwO;&ObPWY-Uf2)4fngil3XM|yoFOli`;>D*8{?f^+MUUJ2cn&N-)~W$=tkLln0n>UWUkA9n5XrZN$MBk#M`HrqR>C}@t1EpSqhwjVH6u1^>3E?YDi?-hZ_Db#?CRuljz^mZEM<` zw()Bl)3$Bfwr$&PVVx5j^$SyXF zYceo2aQS~N5XcpQxck!4EUTHvO1WK@MoZYRv0CU5i=KT_C-M_!H7LB?QJ1Wwo(KOp zjs5j4Q<;R1Zy)`^a024EB!K^359-)lR)cl!Sh zGu_g|jaBVtVnTMI=iqE9*D(DoZy<0pB!usk4?BQ#kv$}6gJ*jO_WdK# zP}2EBJI1}JsGGa?mo-gp905iUShY2rT-L|HTN0bY%G(4t5 z+dkJI+z$11^zhPH2Pduk*bm$!X@mx1DmFr<=GgU-lFn-m@HAv&O&oN2rR~R+N1ges zP?)1Zu2;tS+_95N<1zyC%&D{wp@|!KO(LYRo?RfDF+l%(`nQ+HX+Wl`w|Ejt;ArVM z+CX_HcgqB>$7N2Dc^f+iQr&hiN61TRS^FP$BYn8XUJ)Nhi>89JV`!&|sLUc^v&jFTlP zbixH_17m2SH_g2M-46W8_2Wf#DHCS^BLzF68PpN`(E2ZZJ&Rm*Z~A>$!MZvTi(0ew zQEC}1a!OGP2YB5{a|Cb^Cf!cg7=lG)p>a=&?r7LqKzi z7oYM<=>7z0@PY_g)GJj%=^t)BJu(hROZi)d!O6twewwP8^jK^kWi zcH*pM!CUkmID(lxD^7-(;7h&zW`C^EDgLUL`!3=zSf0()w_?t-BE>ec&4!d=Ovy8q z8loA8Nyv~yD;bvhI=0Q=Rmf=J!XDT1j?zz;?WhO2)FU|k2^XTdu*p`qS2S4*Z~ei@ z@tcY_Le-f0*#yn`JVbppl%73DkMw}DzF9HDTz=j?HQ#>z-J{av$BMZcTyW)snx~JT z_9Id7zTjk{c*#&3Bmt%dB!uMg&sW-M)`9y|bIwfY!7|>q&y_2r9+#uH!<1gBNz{{^ z0@lA*vFsGcnu_v68*M+~>gSl5J8@YpQX4OHgD!}Sq=6iJ{rgz+*(9yj;t@46E6Gl9 z&5TO4xNIvkp}JJ445D;7X9KYL7l!1mDvEY$SdWai(^Wi5Flm-_Kn3ffHEd#TThndE z+3OwdF#C1lh7ngzrieQcrF!4`YXpT-rL&17GYmoo#4kD@pk~x;HDhZ9ok;F@+LuPU{t8nSVZufdSJ=Ye zzGLL*k_c_w&=1{=CMh-2fJu|=;ty1mYW_i9~p0+4u}Nm$G|K16eUE)Xfe@I?f% z87S7Y$kb9()s)>$;J6p;Ce11Rv!;M>`u6=YH16Gh=R`H^TBT?ifzGAGCHmGRTU5un zwg8C(;xY!br2J)|4>EN13lM#J5%R5MW)RyTK5a}Lw?b=VPj#DLImj!wq%Ltgg5Q;$ zdK3D5%UGQx9ohn{ddm5$0sqKeI=mmRUKTp*tu}SySj=-I&9SvLTg?Ty&9h8hF7JFS zaU0V}H~!EWP`HEn<)3=x%B+y?hJtr=v>??p0CrTOGi{Ga>WRX{?pPIX3>=FRg!=^}pW zsyadBP2(sO2{+zF#X+1MT(xMZmZ^))gp<)2Lz0?j4c(Xf427TJ^@hVdbDS(AX%&_I zE#|z$|0sJNFao8`S5@N)D1mjFD-6Wkl)(Te^Ce8Ws_Fx%ZOMKSHU=@c>DM>6yC;Yv z*(;FxnOQk7et_+j6?7geK$9nw+hiQ#-cIy(_lWmg&trt^-ml|g=4mC z$a>*APS#yYDg{da zgj1twxzmk&m*54-l`KobVGb}AkN*^_;n$4KRP%IcAgDg1{}?vnK*QLr1m08H)8T4v z`t$s;TlYB@4tAKrv|$_-ht^9-4y2pL*}##@3E!uJdKP}KJQ_)JE$FjgtuO{nqpHg> z@IP-+ESH|=3<4*lb%~N;i>JuRI~r_EK$VfGa!tB@_r37kMn%9$x(E+T`D3{^ko~|9 z{!sSJ7NM(3t{A;l_W&Pw$1N#g@;@ac;&b+bpyK@nPkQN=s;-wckFlMzUa{RzuHMp4ERFuzFz)TLMAoca6uC__ zcCdZ6iSD(sJ@XkWtb~y^m|Dc6$2|a9Cr>W)Qy5z);-bz!CDCGJzY?cAt}G2pMJQz2 zcOX8px=X<3sTl4Xsk9kKNZU!BWb24b8nQfL18X`kH#1fdUJVeNG!Ejx(f9-hHgV6q zP~w8a;d(E5p*%Z{j2i*Vi*mV8y3O~~x&^q1=G|NhMDcylddwvcwVgXCry_M8P{58Z z(22JQ9(=Zu+t7O0;cwp<9Bo&5#O6;p{8HilM-+(yIiP^(t{WM*isNhvAAn4+w71Q1 zl)~yP_dCZ5OVH@9<>Zmi-d&yX!+UBR2H9vs~fCh*(4)YFwR?IGyV6%o3Q za*_uBynuz5`#X6pMP1BC;&NpZ`W1WeK93Ac_+`dmN~_qFspvkN(6SS}#`xyfph`wu zcEje|@pHMv2PbWc5ov2K_z(pLfNK*<;hh%!n=$t|JByZu2`D^`P=3L z0!e%Le&i}SmawN!Fuvq(N7~_c1EtyFxK`S^g;su$I3=%H+7%Y&^(|eJF4z5wk__Z9 zLyA7{-H5%ZMo|qrdqxhSWPF=r(JrDIi5`=#IeQbxYy1&trEyybS61$vG+< zCF15|Fbd@95~-AJ&QrCk12&e{i9;^Y_Wvb_6LU*ec< z!yZN~T7*VAJ(AQ#EC9SM0&HO>SOKgmz4fQ880eO5L`ghBE9Q34;0521rCVM4V>+y8!+z-xCU-k3o>o>)Ln+{nNJwxb!d@VtyD3_1Aeh`? z1OjUthj57|T|08Pz%2y?6sjFpqTRIVALe_1-A;6~;fnejc7CxEzZrqKc=c$I1zD4* z-B8@mf?j)=CE9#rI*Pxr6)q+boTC9bSNcYI@2+vLEWsy(y?z-Two1nYDYjR3D@IOw z^A-c{oF>lY8Mv@;kFEK`duh5L`ilfaX81Hezrv4T)J%U=(_KDx_BXPu*BV`GoNZgi zRNKRG1oz~JeVE{GTCUeP+)gP{qX>=g$NiovA<85WD_hgGgfo<|jBc6PRN-20Dj88P z{ZVu~A61uJEZ-#M;HFnzQ`wOn7oQd-YGykg=(EHx*&?|Ctng=9TYmc50~-d$7MBK5 zgbs8EM)T*b@~Gxipv}FVi-d1+W|@Euq~;b z5sjB6RZOW_dq?-?BywG>=ANc>cCnbkC)SHowc9F7Cl)yW(`5yqOJd4Eq8T)XX zR4i!8Gvs~P~K@A&9$^E)B1=PsC4H`nag+f2Xoj8RF@?g&K^IrAzm+qK*dO`{#Zrc2s z57i^ivX_aHYcv~ReUiok8k>|x`r`aLh2?J4g!Ek~4x=VpS(mvN&X%akC zgnt6x$}vLq@6{=VnrRqTcr@L8@pTq@IG*X$i3a?MXduFaSlf%?#^GN4OBFw{&f03@EfL( z)rYhlm$svrDXDpm=_@9Nk7#dd-*n~svTC=!^|NtVDlj3MlGSIIJ*t5!&iduBW?k}u zLLv$~S5#qYrCJv25olTTil)?kHo^(87X3P;P_fEfvgkf}jTXl6LI1e-yhxp-(-dd} zSCn6u$cDYYo%1eO58GF&=73eS^SQKlYRO&&YaT%;Lv@C-nC5`cgv z9Z4=lGvBny;EV0Y+6~dt>?OL&$8WO{w2Kq4c(q0TbWuS@OR6VSxZT;sF~L7?ATVDG zV9J33U5XliFV**DGWI}n7G=TsLjIc1up!#>0SU;I{L=ZWocY0vSlWTez`MPT;axAH zMd=&)5jn0pIjABGi)J=?R>;!wyaLxGFd-s0EpgctN#?@y6LBGu7{w`YfEq(jPAU$o;0uYsCrbbC24vNk3oB{1&u(y+U>-^s|$s?QZON zb`N%TvRkQW)=flWZ(m@p+K_RX1|uW;Y#p^d(Nu$f+2Bht(ytCrZ@>3PvqbNMXlgvKNhIARbp z9LF*0=x15<@^bs?;a5nd!3ssTD)M}Sq&LV0x3eGq!x7^&0WwyrkmjkA_o(eS?wej* zLvUms&}S=pwbIx4H(1|URLu|3V@Dt;+F%pXh%rZzoBO2EydMMOlYzq1a%}R65j~4B zl@^-NDzmmGGX$Kln9QdU!5Z%(VNg7U*lgrE)!NOY8}D5RHLI;NczkFG^%)!1^4(K8 z^@p4a^Ax*G1F2g+@Z!4N#hg=%g1#|MB2sVtDGY zmmvf}RJf1E>>4YB0lyu6>(@*P&|@m^f`dw>EadGSIV8G&&#Pk8SG@vrlT@_LR#=x7 zE+iu23G23-g$pk3I?&_KHY86G`&LP$dvNO;u&K$`Vj-rPDS!A&o`_#85cx+$Mau%Cwg2C34PrXs;tyHtMkfg2BEaHY=n&;gkyD{AN>GB@ES%&Uw!9`>S!019|4R`zd9t2} zXCJc%xBco&Dpirz8_BkQLbn=%U7rF0J`#!ZmBManhkh023r<}o{YNe{ z<5#+*GDG%UzCcWVc1Z2P#X~>OS!nB=$;k%-Ch9RNKFC4)qW{#!sOg5%6A;om!=E{S zxRAWw=mLF`X=L1ahLt~C4jvF^ zTLGV%dgTZsf3k1n048y>i13xT1u`Hvl<_;RZ#0GyQNI{sfy* zGDn;E7&w^VAQY4ApNU44g>T0B%V3C`0oBuk5^r=M8fm@*@?u5>P6~g=8yzm6^4B#V0KX16S&(vN6@b>CQ(Xbm+2Ot`8kL zkkCjJKMJ0CRrnGsR_BC=NYGnVwSe33{OIZwBRE_PbZOKBPD>ZRJu!g;>6e9SnZu1U z?8R)s-58y0+?6N0rN(Qt@JkS^2o03SIH-jtar+ikluy+Yu@|EaN7B1<_m8UU3>)ys zvg#$!b&>OmIMxO!v3U^m1D2F)0!JOZ&%wyY?@=93QzMFc2n^(I#W!}!BI(_PN8(nF zFJrW70sq)gc($b~ypJOk^dpL6av-B;VKaovb`a8dj(90LE01F#zZSd87-cM+`Cd;I zOxo=J(shlUyJrHj1Nj-S3;086_uQm|EQqAnD5IBcXT)GwJlXdlb|?q6?0{ozowp|F_gV*esU5nZo#c|USa5Apx(%(J=7la z)nL2XJ1Xh%W9=NY~(&GK;N=~+$BcrsrX&=@CMN29m{ z;X-~HyNv6w?I?I}!U+s2OzSnu-qvq@iQFqP*;Ru$aS}YKy}OjB@g$ZS#aU_vFrd$^ z`LsSTx|~tUAa-1AgZtRj`S3Y z(Tyr%aOJnAOpZcJ5LkR~GjMEf{}Ju}i%v9P@V`23?UF}M^eYbW38WwmT?0 zhl$1i$S4uQy{M|bGuM=howt?QAQD|DJM+MNF3vYPavrF=Zdk&+slj@543U)oeFr@T z0tBuwDgoka{D8|5@})>eN4)dPKpj3?-4it;l?VJ$`JzM6r?;fDUnMw=Dxa%#?)@!N z_?tWtttaOX%pbRw`H1qEY~y(&f?6AY1@=8wcsx|~ZlVSLFnwkmB%V}#nW6Vbv=hqe zzu1%51%$l;+DI^s=34O;_PW9k=*MA&%sooD(}9Quf}@wUNP(O#uNeBmU@@CDkeXcE zu>Z2l!gQi*hfA&3;n$~;k^P!b64G03V};DQ_k*mJ>po7TuZF!?FLLXQ3;PKkx!{T! zWu0Q>%;%5z>zR|ra69JqDwC{xD(lS3_*e8(-p)=26UMK7V3hjPJs;V96@3dUnxWL< zz0*O;GT8i6e@*ng;)VWuv*Hj#3;ESBZ0Z}}M}(&6T@E;~+ZDoxmQwz0c25GwxH8HEE}Cxxra*S>g2bww{*3hrwAMdA}q0OCNvZBlydqjg74LjINzjvM)C0adSGUnISmUxZo?x>ewcHa>>|pbY#)oSPf2| zO!Wm_^xHGUZ-ILoj55E-qYSoFd5;r2qN-JaCwWct7f6Hgrn_ln&^wb1l-=kKHnXe# zuA4JYVa*>VvtKgG5;$R9G9SgtOn>LH61u1; zD_Uz(`P-#5Ie>XkQ4w8DycjX0e;&<_O8kWr9)DYs=zU?}sg$*YpvT$*wLWt|i1FU& zo$H_N5KJZ*%~R;bz%5#&S{{8U-(}JaCVJit59{34mL4XTgP}HfKrZQ)ds)*E5fhPH zVlqsqGY>K|e27NL#5s?HGXms$6g!f%uG$qr2KktV(70-<7BxCND#k{)Pi(_GL*uUi zTRbxiyTAa6e3QoFafQan3fQAu*=xrEK{bXG{}H(y9e+6Gch3zl=e2Veg7T0U)C%OfBKJP@s19D^P1ji%q=poDKJ&e6r z{%=dq`}D)8qKJ~(zyGE}oq1kmH;`x6x+Qa0b7d5zd){j(8^aW4q@bK=?)sLgD%gb) zhE__28aO0&Fb8a8J`*D05(SO1#LlF=7CF>QPgfv{LMlG;?7{CPm}u@_&OIzUtA3Tv zA3C979g7g^!u6Lv*k>2*XaiOwzaJC{xiZA9SD+u%0x)S-r}S1f+4r=Nx*)l8a%YX(;dUS>W}&e=~j6jIk0 zQAf`Ob+I<@84u#&`GfsEAv$BjlgtCB=|1>`zrkk^>qXVU#AjbfSYa7|6O$sBg(_$b zdP}rhwP|P4-6X{nI$C@KSRakq$2We$tL#JqvF0*JeO7&S?>~1N&BY%%&^Do?FP+qY$ED9^+G1(15$j_b=V4{AHZ$ z!=Lw#FFbeT0J&(dOVL+$W~8*DsP5b(Hk=(Y9(<+u~ z1v1spN4O3P>p8&!x?Wx$FtBP1pdidL+u){ZUD65jTaG$w>kDdyA3CU=VJ7zqnYtQp zWxk;%(?)j14Wf)m+&k^1X+(i)wud)@)Z$F&%jzx^$O<3Tr+(wX;=HYKXtJ<}5un#j zOm(}5>S=XImWI&kz$?O#7uvAfIwperUc~T(2asPd^ep$zkbhkg{J$ns1=s0EuRrFIOqb+X1YKrC7N>YMrfn;LMfXSS zu7XjLiIUOXxHn`RkK02p{vu#62Y%V5SKyybu@5>K8(o*F(m#EOp)j$ezf&&FbLk6$ z*^&*-L72@rc>b!g8@LBWZL;2Wx%V&nUinTnn-efs;Q^A&7?i*X-#8({u&J2lFJ8-H zd{H(0ecop2>kS>AS(}r;n;3b>5AEP+yyzqXtT01}jsWl6FszT`s~_`D!nRF9U-wHT zjTU1HDB79=IGb4BRsIDZML{Z~ItD+*LODewoX&K1o-1C6X`rz}4~F`5f-9oSSQ< z|H+5O;?lh$IxIL<8HTp!oq?1 zx0oZk^_GvGgl(Ca^0&=eM>(5WGMJNbL;r914R9FB4{k{KS)%QfULzlgv;=6$Z&i^lQ8P(rQ%77Ur$S0BL{>#~ z>~Po;dqGfhNX^Rb#+sHnC}Hmyx=B)~Ct=k>}apH6-hSO8?U2X7)B6JRuL6D*HDi$IV&pn z3zB_fL(dAiCauUjSBz)J(po~)4k_xea!5JiWK%K}GnK@Y<_oGrlbxPPj@c#D(FrAw`2UsE8ttVy2T}K~8eZ zGDmJHDyIwic2E|i>eZ0qErhzwCz~1dx%lm3ZY5`y}KkN->}o0E_~ z#o_$4aD8ZB;8MbRp)3`6)8?@T3nrZ$w|+P%!^=p#z14W#18+_wh@dAyl`nkH5BBZx}#qnGrt`earNQW2eH zwplg-*(y?%a>~BkG|tG+o)SEl*8&nR?ya%!>Ry}f)v?ph3BJrsbUag@P&W8LuXa&9 za0IRnEih=q8N}NWFWdbZwRbrvoyH+U3h$UWZHg!{{lh9E$wEkmP%q1Amp!~K9a-ML zlYSHtaTg}wq6P<2lo+Z%j7D-?-_s6A8J5A3a@0M06^%UePl%~P!=b)cj(p`9zbEF3 z6Q=FxPJabaq|GNsi_@?rd)9uE^MUq3{GFyF2JI>&PiH44f{D9qwjipAHP6li@-LlY z{SSJQ;@k2!^~+?*nCpvR?x&VM`4fG&9+4<(^RE0jRv;+ne&pbQ(PP9*7TRR~Ur$yn z`^Y*6lZ)mgnn~6lofqPf zX}7x>Z%_}PM$Bs&2X}BtOOgYA`y-r0ADo{iU+XAv;f*w4Czs(Dor#E37u8b?zR!P( z7{{b2ln6#A=7t-FV3I$pykT`HU4mwzR&e325;>{*Cy^4pUXBzXiSKBdVpBY?zbG>H z5BtR#58uIxR-_Ksfm&JpjvVo7Ga~8W)W!d6UyQumCuv`@)OpZ-)0eJj+?pj&L6##J zSAaeCr23a}piM<%j?vLPxl7fOtcjjyGax#R0|~#4&4R#0W)Pg!RX|QA{qBO*(Fzg+ zjcu|ra8+C)G)Pp|%*pmp^E{lWf53-=T|Xa0ST%bxQPc4}Q(|}MWl8IjHpuI;&Y7$a zT+S%8?HlZ$$hEKoR7}~*Vg24{v9&KN0DEdaK_*M!+Z&Fr|NXeSa+oN𶰚Lxi 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νIy2ITE*+= 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 +Babel and hyphenation patterns for english, usenglishmax, dumylang, noh +yphenation, loaded. +(/usr/share/texmf-texlive/tex/latex/base/article.cls +Document Class: article 2007/10/19 v1.4h Standard LaTeX document class +(/usr/share/texmf-texlive/tex/latex/base/size12.clo +File: size12.clo 2007/10/19 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texmf-texlive/tex/latex/ltxmisc/url.sty +\Urlmuskip=\muskip10 +Package: url 2006/04/12 ver 3.3 Verb mode for urls, etc. +) +(/usr/share/texmf-texlive/tex/latex/setspace/setspace.sty +Package: setspace 2000/12/01 6.7 Contributed and Supported LaTeX2e package + +Package: `setspace' 6.7 <2000/12/01> +) (/usr/share/texmf-texlive/tex/latex/amsmath/amsmath.sty +Package: amsmath 2000/07/18 v2.13 AMS math features +\@mathmargin=\skip43 + +For additional information on amsmath, use the `?' option. +(/usr/share/texmf-texlive/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 + +(/usr/share/texmf-texlive/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 +\@emptytoks=\toks14 +\ex@=\dimen103 +)) +(/usr/share/texmf-texlive/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d +\pmbraise@=\dimen104 +) +(/usr/share/texmf-texlive/tex/latex/amsmath/amsopn.sty +Package: amsopn 1999/12/14 v2.01 operator names +) +\inf@bad=\count87 +LaTeX Info: Redefining \frac on input line 211. +\uproot@=\count88 +\leftroot@=\count89 +LaTeX Info: Redefining \overline on input line 307. +\classnum@=\count90 +\DOTSCASE@=\count91 +LaTeX Info: Redefining \ldots on input line 379. +LaTeX Info: Redefining \dots on input line 382. +LaTeX Info: Redefining \cdots on input line 467. +\Mathstrutbox@=\box26 +\strutbox@=\box27 +\big@size=\dimen105 +LaTeX Font Info: Redeclaring font encoding OML on input line 567. +LaTeX Font Info: Redeclaring font encoding OMS on input line 568. +\macc@depth=\count92 +\c@MaxMatrixCols=\count93 +\dotsspace@=\muskip11 +\c@parentequation=\count94 +\dspbrk@lvl=\count95 +\tag@help=\toks15 +\row@=\count96 +\column@=\count97 +\maxfields@=\count98 +\andhelp@=\toks16 +\eqnshift@=\dimen106 +\alignsep@=\dimen107 +\tagshift@=\dimen108 +\tagwidth@=\dimen109 +\totwidth@=\dimen110 +\lineht@=\dimen111 +\@envbody=\toks17 +\multlinegap=\skip44 +\multlinetaggap=\skip45 +\mathdisplay@stack=\toks18 +LaTeX Info: Redefining \[ on input line 2666. +LaTeX Info: Redefining \] on input line 2667. +) +(/usr/share/texmf-texlive/tex/latex/graphics/color.sty +Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) + +(/etc/texmf/tex/latex/config/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package color Info: Driver file: pdftex.def on input line 130. + +(/usr/share/texmf-texlive/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2010/03/12 v0.04p Graphics/color for pdfTeX +\Gread@gobject=\count99 +)) (./test.aux) +\openout1 = `test.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5. +LaTeX Font Info: ... okay on input line 5. + +(/usr/share/texmf-texlive/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count100 +\scratchdimen=\dimen112 +\scratchbox=\box28 +\nofMPsegments=\count101 +\nofMParguments=\count102 +\everyMPshowfont=\toks19 +\MPscratchCnt=\count103 +\MPscratchDim=\dimen113 +\MPnumerator=\count104 +\everyMPtoPDFconversion=\toks20 +) [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux) ) +Here is how much of TeX's memory you used: + 1447 strings out of 495061 + 17244 string characters out of 1182621 + 68733 words of memory out of 3000000 + 4665 multiletter control sequences out of 15000+50000 + 5601 words of font info for 21 fonts, out of 3000000 for 9000 + 28 hyphenation exceptions out of 8191 + 27i,6n,20p,218b,191s stack positions out of 5000i,500n,10000p,200000b,50000s + +Output written on test.pdf (1 page, 25391 bytes). +PDF statistics: + 14 PDF objects out of 1000 (max. 8388607) + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/BasicWLC/dssWLC/doc/test.pdf b/BasicWLC/dssWLC/doc/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dccd058a8b73d9e7741c1101b462b53badb75e40 GIT binary patch literal 25391 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 j1 + j2 || j3 < abs(j1 - j2) + error('j3 is out of bounds.'); + return; +end + +if abs(m1) > j1 + error('m1 is out of bounds.'); + return; +end + +if abs(m2) > j2 + error('m2 is out of bounds.'); + return; +end + +if abs(m3) > j3 + error('m3 is out of bounds.'); + return; +end + +if m1+m2+m3 ~= 0 + error('m1+m2+m3 is not 0') + return; +end + +t1 = j2 - m1 - j3; +t2 = j1 + m2 - j3; +t3 = j1 + j2 - j3; +t4 = j1 - m1; +t5 = j2 + m2; + +tmin = max( 0, max( t1, t2 ) ); +tmax = min( t3, min( t4, t5 ) ); + +wigner = 0; +if nargin > 6 + % use pretabulated factorials + for t = tmin:tmax + wigner = wigner + (-1)^t / ( fact(t) * fact(t-t1) * fact(t-t2) ... + * fact(t3-t) * fact(t4-t) * fact(t5-t) ); + end + + wigner = wigner * (-1)^(j1-j2-m3) ... + * sqrt( fact(j1+j2-j3) * fact(j1-j2+j3) * fact(-j1+j2+j3) / fact(j1+j2+j3+1)... + * fact(j1+m1) * fact(j1-m1) * fact(j2+m2) * fact(j2-m2) * fact(j3+m3) * fact(j3-m3) ); +else + % calculate factorials from scratch + for t = tmin:tmax + wigner = wigner + (-1)^t / ( factorial(t) * factorial(t-t1) * factorial(t-t2) ... + * factorial(t3-t) * factorial(t4-t) * factorial(t5-t) ); + end + + wigner = wigner * (-1)^(j1-j2-m3) ... + * sqrt( factorial(j1+j2-j3) * factorial(j1-j2+j3) * factorial(-j1+j2+j3) / factorial(j1+j2+j3+1)... + * factorial(j1+m1) * factorial(j1-m1) * factorial(j2+m2) * factorial(j2-m2) * factorial(j3+m3) * factorial(j3-m3) ); +end + +% function for including 0 index in pretabulated factorials + function res = fact(x) + if (x==0) + res = 1; + else + res = factsave(x); + end + end +end +% Reference: Wigner 3j-Symbol entry of Eric Weinstein's Mathworld: http://mathworld.wolfram.com/Wigner3j-Symbol.html \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/cofactor.m b/BasicWLC/dssWLC/getparams/cofactor.m new file mode 100644 index 00000000..994b4ce6 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/cofactor.m @@ -0,0 +1,18 @@ +function C = cofactor(A,i,j) +%COFACTOR Cofactors and the cofactor matrix. +% COFACTOR(A,i,j) returns the cofactor of row i, column j. +% COFACTOR(A) returns the matrix C of cofactors. +if nargin == 3 + % Remove row i and column j to produce the minor. + M = A; + M(i,:) = []; + M(:,j) = []; + C = (-1)^(i+j)*det(M); +else + [n,n] = size(A); + for i = 1:n + for j = 1:n + C(i,j) = cofactor(A,i,j); + end + end +end diff --git a/BasicWLC/dssWLC/getparams/dssWLCcalcparams.m b/BasicWLC/dssWLC/getparams/dssWLCcalcparams.m new file mode 100644 index 00000000..ef0d5113 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/dssWLCcalcparams.m @@ -0,0 +1,119 @@ +function [eb,gam,epar,eperp,eta,alpha,zetau,delt] = dssWLCcalcparams(del,Nseg,varargin) +% calculate the appropriate parameters for a dssWLC simulation +% for discretizing a continuous WLC with persistence length lp=1 +% usage: +% dssWLCcalcparams(del,Nseg,'interpfile',filename,'alpha',alpha,'LMAX',LMAX +% ,'YcoupleFile',filename) +% +% Required arguments: +% del = segment length +% Nseg = total number of segments in the chain +% +% optional arguments: +% +% interpfile: if supplied then interpolate the energetic parameters from the +% the given space-delimited file. Otherwise, recalculate from scratch +% +% alpha: if single value is supplied then calculate the energetic +% parameters for the given alpha value. If pair of values is supplied then +% this gives the range of possible alpha values, and the code optimizes +% over the possible alphas within this range to get the best length scale +% of accuracy. Default: [1e-5,1.5] +% +% LMAX: if optimizing over alpha values, the maximum l-index of the +% matrices used to calculate structure factors; default=10 +% +% YcoupleFile: if optimizing over alpha values, the file containing saved +% coupling coefficients for spherical harmonics. Default: YcoupleSave.mat +% if this file does not exist it will be created as the coupling +% coefficients are calculated. + +p = inputParser; +addRequired(p,'del',@isnumeric); +addRequired(p,'Nseg',@(x) isnumeric(x) && x>0); +addParamValue(p,'interpfile',NaN,@ischar); +addParamValue(p,'alpha',[1e-5,2],@isnumeric); +addParamValue(p,'LMAX',10,@(x) (isnumeric(x) && x <= 20 && x>=0)); +addParamValue(p,'YcoupleFile','YcoupleSave.mat',@ischar); +parse(p,del,Nseg,varargin{:}); + +if any(ismember('interpfile',p.UsingDefaults)) + % calculate parameter files directly + if (any(ismember('alpha',p.UsingDefaults)) || length(p.Results.alpha)>1) + disp('Calculating dssWLC energetic parameters, optimizing alpha for lowest length scale of accuracy') + + % load in the spherical harmonic coupling coefficients + if (exist(p.Results.YcoupleFile,'file')) + disp(sprintf('Loading Y coupling coefficients from %s', p.Results.YcoupleFile)); + load(p.Results.YcoupleFile,'Ycouple'); + else + % recalculate & save if file does not exist + disp(sprintf('Recalculating spherical harmonic coupling coefficients. Will save in %s and avoid recalculating in future.',p.Results.YcoupleFile)) + LMAX = 20; + Ycouple = getYcouple(LMAX,p.Results.YcoupleFile); + end + + nk = 100; Ltot = 1000; LMAX = p.Results.LMAX; + % cutoff in structure factor error for calculating length scale + cutoff = 1e-4; + + klist = logspace(log10(1/del/10),log10(1/del*2),nk); + + % get plain wlc structure factor + display('Calculating plain WLC structure factor') + nseg = Ltot/del; + I = eye(LMAX+1); + for kc = 1:nk + Mplain = shearWLCpropagator(klist(kc),del,1,1,0,0,0,LMAX); + Mtot = ((nseg+1)*I+Mplain^(nseg+2) - Mplain*(nseg+2))*inv(Mplain-I)^2; + Splain(kc) = 2*Mtot(1,1)/(nseg+1)^2; + end + + options = optimset('Display','iter','TolX',1e-4); + alpharange = p.Results.alpha; + display('Optimizing over alpha') + [alpha,lscale] = fminbnd(@(alpha) dssWLClengthScale(del,alpha,Ltot,klist,Splain,Ycouple,cutoff,LMAX),... + alpharange(1),alpharange(2),options); + [eb,gam,epari,eperpi,eta,err,plen] = dssWLCminLpParams(del,alpha); + epar = 1/epari; + eperp = 1/eperpi; + else + alpha = p.Results.alpha + disp(sprintf('Calculating energetic parameters using alpha=%f',alpha)) + [eb,gam,epari,eperpi,eta,err,plen] = dssWLCminLpParams(del,alpha); + epar = 1/epari; + eperp = 1/eperpi; + end +else + % interpolate parameter values from the data file + disp(sprintf('Interpolating energetic parameters from tabulated file: %s',p.Results.interpfile)) + data = dlmread('dssWLCparams.txt'); + params = interp1(data(:,1),data(:,2:end),del); + eb = params(1); gam = params(2); epar = params(3); eperp = params(4); eta = params(5); + alpha = eta^2*eb/eperp; +end + +disp(sprintf('Energetic parameters (eb,g,epar,eperp,eta): %f %f %f %f %f',eb,gam,epar,eperp,eta)) +disp('Calculating dynamic parameters: zeta_u and del_t') + +% find appropriate xiu value +eperph = eperp + eta^2*eb; +xir = 1; +xiulist = logspace(-7,1,50); +L=del; +pval = 1; +tfast = zeros(size(xiulist)); + +for uc = 1:length(xiulist) + xiu = xiulist(uc); + [evals,evecs,pareval] = ssWLCdynamics(eb,gam,epar,eperph,eta,L,xir,xiu,50); + tfast(uc) = -1/evals(end); +end + +dt = diff(log10(tfast)); +lxiu = interp1(dt,log10(xiulist(1:end-1)),(dt(1)+dt(end))/2); +zetau = 10^lxiu*del/(1+1/Nseg); + +% get the appropriate delt +delt = 0.5/(eperp*gam^2*del)*zetau; + diff --git a/BasicWLC/dssWLC/getparams/dssWLCgetParams.m b/BasicWLC/dssWLC/getparams/dssWLCgetParams.m new file mode 100644 index 00000000..399812e0 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/dssWLCgetParams.m @@ -0,0 +1,213 @@ +function [g,epari,eperpi,eta]= dssWLCgetParams(del,eb,alpha,R2l,R2c,R4l) +% ------- +% calculate g,epari,eperpi for a dssWLC model +% where del, alpha, eb are fixed and we want to fit the moments R2l, R2c, R4l +% alpha = eta^2*eb/eperp + +% solve for eb to match lpeff (using xi_1) +% solve for eperpih = 1/(eperp-hat) as a function of g to fit R2c +% solve for epari as a function of g to fit R2l +% solve for g to fit R4l +% ------- + +if max(abs(imag([del,eb,alpha])))>0 || eb<0 || del <0 || alpha<0 + moms = 0; M1=0; epari = 0; eperpi=0; R2ctmp = 0; g =0; + return +end + +x = alpha/(1+alpha)*eb; +M0=1; +%% +LMAX=4; +[xivals,tmp] = expandFsph(del,eb,alpha,LMAX); + +M1 = xivals(2); M2 = xivals(3); M3 = xivals(4); M4 = xivals(5); + +%[M1 M2 M3 M4] +%return +% -------------- +%% coupling coefficients +% go up one with D10 +alj = @(l,j) sqrt(3*(l-j)*(l+j)/((2*l+1)*(2*l-1))); +% go up one in both l and j with D11 +ahlj = @(l,j) sqrt(3/2)*sqrt((l+j)*(l+j-1)/((2*l-1)*(2*l+1))); +% stay in place with D20 +blj = @(l,j) sqrt(5)*(l^2+l-3*j^2)/((2*l-1)*(2*l+3)); +% go up 2 with D20, for j=0 +bhlj = @(l,j) 3*sqrt(5)/2/(2*l-1)*sqrt((j-l)*(j-l+1)*(j+l)*(j+l-1)/((2*l+1)*(2*l-3))); +% go up one with D30 +clj = @(l,j) -sqrt(7)*3/2*(1+5*j^2-l^2)/((2*l-3)*(2*l+3))*alj(l,j)/sqrt(3); +% stay put with D40 +dlj = @(l,j) 9/4*(35*j^4 + 3*(l-1)*l*(l+1)*(l+2) - 5*j^2*(6*l^2+6*l-5))... + /((2*l-3)*(2*l-1)*(2*l+3)*(2*l+5)); +dhlj = @(l,j) 15/2*(l^2-l-7*j^2-2)/((2*l-5)*(2*l-1)*(2*l+3))*sqrt((j-l)*(j-l+1)*(j+l)*(j+l-1)/((2*l+1)*(2*l-3))); + +%% get ec/eperp as function of gamma +A = 2/(M1-1)^2*i*del/sqrt(3); +B = -i/3/sqrt(3)*(2 + 2*sqrt(5)*M2*blj(1,1)); +C = i*del/sqrt(3)*M1; +Z1 = R2c/A/B; Z2 = -C/B; + +%% get epari as a function of gamma + +%s00 = M0*( - 2/3*(del/2*epari + del*eperpi)) ... +% +2*ec^2/9*eperpi^2*sqrt(5)*M2*bhlj(2,0)*ahlj(2,0)*ahlj(1,1); + + +A = (M1-1)*R2c/del; +B = -1/del*(-2/9*ahlj(1,1)^2+2*sqrt(5)/9*M2*bhlj(2,0)*ahlj(2,0)*ahlj(1,1)-2*del/3/x); +C = del*alj(1,0)/3; +D = 1/3; +Z3 = -B*Z1^2/D; +Z4 = (-B*Z2^2-C)/D; +Z5 = (R2l - A - 2*B*Z1*Z2)/D; + +%E = Z1/g + Z2*g; +%eperpi = E^2/x; +%epari = Z3/g^2 + Z4*g^2 + Z5; + +%% to fit R4l, go through each of the individual steps and calculate +% coefficients of: 1/g^4, 1/g^3,1/g^2, 1/g, 1, g, g^2, g^3, g^4 +Eg = [0,0,0,Z1,0,Z2,0,0,0]; %E +Eg2 = [0,0,Z1^2,0,2*Z1*Z2,0,Z2^2,0,0]; %E^2 +Eg3 = [0,Z1^3,0,3*Z1^2*Z2,0,3*Z1*Z2^2,0,Z2^3,0];%E^3 +Eg4 = [Z1^4,0,4*Z1^3*Z2,0,6*Z1^2*Z2^2,0,4*Z1*Z2^3,0,Z2^4];%E^4 +Eparg = [0,0,Z3,0,Z5,0,Z4,0,0]; %epari +EpargG = [0,0,0,Z3,0,Z5,0,Z4,0]; %epari*g +EpargG2 = [0,0,0,0,Z3,0,Z5,0,Z4]; %epari*g^2 +EpargEg = [0,Z1*Z3, 0,Z2*Z3+Z1*Z5,0,Z2*Z5+Z1*Z4,0,Z2*Z4,0]; %E*epari +EpargEg2 = [Z1^2*Z3,0,Z1^2*Z5+2*Z1*Z2*Z3,0,Z2^2*Z3+Z1^2*Z4+2*Z1*Z2*Z5,0,Z2^2*Z5+2*Z1*Z2*Z4,0,Z2^2*Z4]; +Eparg2 = [Z3^2,0,2*Z3*Z5,0,Z5^2+2*Z3*Z4,0,2*Z4*Z5,0,Z4^2];%epari^2 +G = [0,0,0,0,0,1,0,0,0]; %g +G2 = [0,0,0,0,0,0,1,0,0]; %g^2 +G3 = [0,0,0,0,0,0,0,1,0]; %g^3 +G4 = [0,0,0,0,0,0,0,0,1]; %g^4 +EgG = [0,0,0,0,Z1,0,Z2,0,0]; %E*g +Eg2G = [0,0,0,Z1^2,0,2*Z1*Z2,0,Z2^2,0]; %E^2*g +EgG2 = [0,0,0,0,0,Z1,0,Z2,0]; %E*g^2 +Eg2G2 = [0,0,0,0,Z1^2,0,2*Z1*Z2,0,Z2^2]; %E^2*g^2 + +% single derivatives + +% get s01 (step up from 0 to 1, X10 in the notes) +s01= -i/sqrt(27)*Eg*(2*M0 + 2*sqrt(5)*M2*blj(1,1)) + i*del/sqrt(3)*M1*G; + +% get s10 (step down from 1 to 0, X01 in the notes) +s10 = i*del*G/sqrt(3)*M0; + +% s12 (step up from 1 to 2, X21 in the notes) +s12 = -i*Eg/(3*sqrt(5))*(2*sqrt(3)*alj(2,1)^2*M1 + 2*sqrt(7)*clj(2,1)*alj(2,1)*M3) ... + + i*del*G/sqrt(3)*alj(2,0)*bhlj(2,0)*M2; + +%s21 (step down from 2 to 1, X12 in notes) +s21 = -2*i*Eg/(3*sqrt(3))*(blj(1,1)*M0 + blj(1,1)^2*sqrt(5)*M2)... + + i*del*G/sqrt(3)*blj(1,0)*M1; + +%------------- +% double derivatives +s00 = M0*(-del^2*G2/3*alj(1,0) - 2*Eg2/9*ahlj(1,1)^2 - 2/3*(del/2*Eparg + del*Eg2/x)) ... + +2*Eg2/9*sqrt(5)*M2*bhlj(2,0)*ahlj(2,0)*ahlj(1,1); + +s11 = 4*del*EgG/9*alj(2,1)^2*(M0 + blj(1,1)*sqrt(5)*M2) ... + - 2*ahlj(2,0)^2*Eg2/9*alj(2,0)*(alj(2,0)*M1 + clj(2,0)*M3*sqrt(7/3)) ... + + (-del^2*G2/3*alj(2,0) + Eg2/9*2*ahlj(1,1)*ahlj(2,0) - 2/3/sqrt(5)*del*(Eparg-Eg2/x))*alj(2,0)*M1 ... + + 2*Eg2/9*ahlj(2,0)*ahlj(1,1)*(alj(2,0)*M1+clj(2,0)*M3*sqrt(7/3))... + +(-del^2*G2/3*alj(1,0) - 2*ahlj(1,1)^2*Eg2/9 - 2*del/3*(Eparg/2+Eg2/x))*M1; + + +s02 = -2/9*Eg2*ahlj(2,2)^2 *(dlj(2,2)*M4*sqrt(9/5) + blj(2,2)*M2+M0/sqrt(5)) ... + - 2/9*Eg2*ahlj(2,0)^2*(dlj(2,0)*M4*sqrt(9/5)+blj(2,0)*M2+M0/sqrt(5)) ... + +4/3/sqrt(15)*del*EgG*alj(2,1)*(alj(2,1)*M1*sqrt(3) + clj(2,1)*M3*sqrt(7)) ... + +(-del^2*G2*alj(2,0)/3 + 2*Eg2/9*ahlj(1,1)*ahlj(2,0) - 2*del/3/sqrt(5)*(Eparg-Eg2/x))*M2; + +s20 = (-del^2*G2*alj(2,0)/3 + 2*Eg2/9*ahlj(1,1)*ahlj(2,0) - 2*del/3/sqrt(5)*(Eparg-Eg2/x))*bhlj(2,0)*M0 ... + - 2*Eg2/9*ahlj(2,0)^2*bhlj(2,0)^2*M2*sqrt(5); + +% ------------- +% triple derivatives + +v0010 = -i*del^3*G3/3/sqrt(3)*(alj(2,0)^2+alj(1,0)^2) - i*6*del*Eg2G/9/sqrt(3)*(-ahlj(2,0)*alj(2,0)*ahlj(1,1)+ahlj(1,1)^2*alj(1,0)) ... + - 6*i*del^2/3/sqrt(3)*(EpargG/2+Eg2G/x) - 6*i*del^2/3/sqrt(15)*(EpargG-Eg2G/x) *alj(2,0); + +v2010 = -i*6*del*Eg2G/9/sqrt(3)*(ahlj(2,0)^2*alj(2,0) - ahlj(1,1)*alj(1,0)*ahlj(2,0)); + +v1111 = 3*i*Eg3/27*(-ahlj(2,0)^2-ahlj(1,1))^2+3*i*del^2*EgG2/9*(alj(1,0)-alj(2,0)*ahlj(2,0)) ... + +6*i*del/9*(EpargEg/2+Eg3/x)-6*i*del/9/sqrt(5)*(EpargEg-Eg3/x)*ahlj(2,0); +v3111 = 3*i*Eg3/27*(-ahlj(2,0)^2-ahlj(1,1))*ahlj(2,0)*ahlj(3,1); + +%MRT3(ljind(3,-1),ljind(1,-1))/(8*pi^2) + +t01 = 2/sqrt(3)*v1111*(M0+blj(1,1)*M2*sqrt(5)) + 2/sqrt(3)*v3111*(bhlj(3,1)*M2*sqrt(5)+dhlj(3,1)*M4*sqrt(9)) ... + +v2010*(alj(2,0)*M1+bhlj(3,0)*M3*sqrt(7/3)) + v0010*M1; + +t10 = M0*v0010 + bhlj(2,0)*M2*sqrt(5)*v2010; + +% ----------------------- +% quadruple derivatives +v0000 = 6*Eg4/81*(ahlj(2,2)^2*ahlj(1,1))^2 ... + + del^4*G4/9*(alj(2,0)^2*alj(1,0)+alj(1,0)^3) ... + + 12*del^2*Eg2G2/27*(-alj(1,0)*ahlj(1,1)^2 + alj(2,0)*ahlj(2,0)*ahlj(1,1))*-ahlj(1,1)... + + 12*del^2/9*(Eparg2/4+Eg4/x^2+EpargEg2/x) + 12*del^2/45*(Eparg2+Eg4/x^2-2*EpargEg2/x)*bhlj(2,0) ... + + 12*del/3*(EpargG2/2+Eg2G2/x)*del^2/3*alj(1,0)... + +12*del/3*(EpargEg2/2+Eg4/x)*2/9*ahlj(1,1)^2 ... + + 12*del/3/sqrt(5)*(EpargG2-Eg2G2/x)*del^2/3*alj(2,0)*bhlj(2,0) ... + -12*del/3/sqrt(5)*(EpargEg2-Eg4/x)*2/9*ahlj(2,0)*ahlj(1,1)*bhlj(2,0); +%gvec = [1/g^4;1/g^3;1/g^2;1/g;1;g;g^2;g^3;g^4]; + + +v2000 = 6*Eg4/81 *ahlj(2,2)^2*ahlj(1,1)*(-ahlj(2,2)^2*ahlj(2,0) - ahlj(2,2)*ahlj(3,-1)*ahlj(3,1)) ... + + 12*del^2*Eg2G2/27*(-alj(1,0)*ahlj(1,1)^2 + alj(2,0)*ahlj(2,0)*ahlj(1,1))*ahlj(2,0) ... + -24*del/27*(EpargEg2/2+Eg4/x)*ahlj(2,0)*ahlj(1,1) + 24*del/27/sqrt(5)*(EpargEg2-Eg4/x)*ahlj(2,0)^2*bhlj(2,0); + +v4000 = 6*Eg4/81*ahlj(2,2)^2*ahlj(1,1)*ahlj(2,2)*ahlj(3,-1)*ahlj(4,0); + +q00 = M0*v0000 + M2*sqrt(5)*v2000 + M4*sqrt(9)*v4000; + +X1 = -1/2*(M1-5)/(M1-1)^3*conv(conv(s01,s01),conv(s10,s10)); X1 = X1(13:21); +X2 = 1/2*(M1-3)/(M1-1)^2*conv(conv(s00,s01),s10); X2 = X2(9:17); +X3 = -1/2*conv(s00,s00); X3 = X3(5:13); +X4 = -1/((M1-1)^2*(M2-1))*conv(conv(s01,s12),conv(s21,s10)); X4 = X4(13:21); +X5 = 1/(M1-1)^2*conv(conv(s01,s11),s10); X5 = X5(9:17); +X6 = 1/((M1-1)*(M2-1))*conv(conv(s02,s21),s10); X6 = X6(9:17); +X7 = 1/((M1-1)*(M2-1))*conv(conv(s01,s12),s20); X7 = X7(9:17); +X8 = -1/(M2-1)*conv(s02,s20); X8 = X8(5:13); +X9 = 1/(1-M1)*conv(t01,s10); X9 = X9(5:13); +X10 = 1/(1-M1)*conv(s01,t10); X10 = X10(5:13); +X11 = q00; + +% overall polynomial for R4l +R4lpoly = 1/del*(24*X1+24*X2+6*X3+24*X4+12*X5+12*X6+12*X7+6*X8+4*X9+4*X10+X11); +tmppoly = R4lpoly; + +% solve for gamma +R4lpoly(5) = R4lpoly(5)-R4l; + +groots = roots(fliplr(R4lpoly)); + +% want only the positive real solutions +gvals = groots(find(groots>0 & imag(groots)==0)); + +if (length(gvals) == 0) + %disp('Warning: No positive real g solution') + g = NaN; eperpi = NaN; epari = NaN; ec = NaN; +else + g = gvals; + E = Z1./gvals + Z2*gvals; + eperpi = E.^2/x; + ec = E./eperpi; + epari = Z3./gvals.^2 + Z4*gvals.^2 + Z5; +end + +%gvec = [1/g^4;1/g^3;1/g^2;1/g;1;g;g^2;g^3;g^4]; + +%s11*gvec +%[tmppoly*gvec,R4l] +%X11*gvec +%t01=t01*gvec +%t10 = t10*gvec +%q00 = q00*gvec + +eperpi = 1./(1./eperpi-ec.^2./eb); +eta = -ec/eb; + +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/dssWLClengthScale.m b/BasicWLC/dssWLC/getparams/dssWLClengthScale.m new file mode 100644 index 00000000..0bb24b41 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/dssWLClengthScale.m @@ -0,0 +1,58 @@ +function [lscale,params,Svals] = dssWLClengthScale(del,alpha,Ltot,klist,Splain,Ycouple,cutoff,LMAX,params) +% get the "length-scale of accuracy" for the discrete shearable WLC +% based on cutoff for structure factor error +% Splain is the structure factor used for comparison (must be same size as +% klist) +% alpha =eta^2*eb/eperp is the dimensionless parameter setting coupling +% strength +% if params is supplied use the given parameters +% (eb,gamma,epari,eperpi,eta) +% otherwise find the parameters to match the plain WLC for a given alpha + +X = alpha/(1+alpha); + +if (nargin<8) + LMAX=10; +end + +if (nargin<9) + % get the WLC parameters + [eb,g,epari,eperpi,eta,err,plen] = dssWLCminLpParams(del,alpha); + params = [eb,g,epari,eperpi,eta,plen,err]; +else + eb = params(1); g = params(2); epari = params(3); eperpi = params(4); eta = params(5); +end + +Svals = dssWLCstructFact(klist,del,eb,g,epari,eperpi,eta,Ycouple,Ltot,LMAX); + +errvals = abs(Svals-Splain)./Splain; +indv = find(errvals>cutoff/100); +if (length(indv)<2) + error(sprintf('Values out of range with alpha = %f', alpha)) +end +if (errvals(indv(1))>cutoff) + display(sprintf('Cannot get down to the cutoff with alpha=%f. Try extending to lower k', alpha)) + lscale=inf; + params = []; Svals = []; + return +end + +errvals = real(errvals); +% find local maxima +[pks,locs] = findpeaks(errvals(indv)); +% find the first max that's above cutoff +[a,b] = find(errvals(indv(locs))>cutoff); +if (length(b)<1) + % no local max above cutoff; search from the end + if (max(errvals)2) + R2l = Rcoeff(1); R2c = Rcoeff(2); R4l = Rcoeff(3); R4c = Rcoeff(4); +else + % these are the moment components for a continuous plain worm-like chain + R2l = 2/3; + R2c = -2/3; + R4l = -208/45; + R4c = 856/135; +end + +if (nargin<2) + X =0.5; +end + +% plen is the persistence length; we want to find the lowest persistence +% length for which a solution exists + +tol = 1e-6; +plenmin = 1; +maxtry = 100; +options = optimset('TolX',1e-8,'MaxFunEvals',1e3,'MaxIter',5e3,'TolFun',1e-8); +ebguess = 1.2; + +% first go through linearly to find an upper bound +% (lowest p where there is a solution +maxtry1 = 100; +stp = logspace(-6,log10(max(3,del)),maxtry1); +plen = plenmin; +M1func = @(eb) feval(@(x) x(2),expandFsph(del,eb,alpha,1)); +for tryc = 1:maxtry1 + plen = plenmin + stp(tryc); + + M1 = exp(-del/(plen)); + try + [ebeff,fval,errval] = fzero(@(eb) M1func(eb) - M1, ebguess,options); + catch err + disp(sprintf('Failed to solve for eb, moving to next plen. %f', plen)) + continue + end + [geff,epari,eperpi,etaeff]= dssWLCgetParams(del,ebeff,alpha,R2l,R2c,R4l); + %[plen, ebeff] + %[geff epari eperpi etaeff] + ind = find(epari>0 & eperpi>0 & etaeff > 0 & geff<1); + + if (length(ind)>0) + plenmax = plen; + if (tryc>1) + plenmin = plenmin+stp(tryc-1); + end + break + end +end + +plen = (plenmin+plenmax)/2; +for tryc = 1:maxtry + M1 = exp(-del/(plen)); + [ebeff,fval,errval] = fzero(@(eb) M1func(eb) - M1, ebguess,options); + [geff,epari,eperpi,etaeff]= dssWLCgetParams(del,ebeff,alpha,R2l,R2c,R4l); + ind = find(epari>0 & eperpi>0 & etaeff > 0); + + if (length(ind) > 0) + plenmax = plen; + else + plenmin = plen; + end + plen = (plenmin+plenmax)/2; + + if (plenmax-plenmin) < tol + break + end + + %[tryc, plenmin, plenmax, plen, length(ind)] +end +if (tryc>=maxtry); disp('WARNING: failed to find minimal plen'); end + +plen = plenmax; +M1 = exp(-del/(plen)); + +% now find the parameters given this persistence length +[ebeff,fval,errval] = fzero(@(eb) M1func(eb) - M1, ebguess,options); +[geff,epari,eperpi,etaeff]= dssWLCgetParams(del,ebeff,alpha,R2l,R2c,R4l); +ind = find(epari>0 & eperpi>0 & etaeff > 0); +geff = geff(ind); epari = epari(ind); eperpi = eperpi(ind); etaeff = etaeff(ind); +% calculate the error in the constant term of R^4, pick the solution with +% the smallest error +errcomp = zeros(size(ind)); +for c3 = 1:length(ind) + moms = dssWLCmoments(del,ebeff,geff(c3),epari(c3),eperpi(c3),etaeff(c3),1); + errcomp(c3) = (moms(end)-R4c)/R4c; +end +[a,b] = min(abs(errcomp)); + +geff = geff(b); epari = epari(b); eperpi = eperpi(b); etaeff = etaeff(b); +err = errcomp(b); +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/dssWLCmoments.m b/BasicWLC/dssWLC/getparams/dssWLCmoments.m new file mode 100644 index 00000000..72e7658b --- /dev/null +++ b/BasicWLC/dssWLC/getparams/dssWLCmoments.m @@ -0,0 +1,154 @@ +function moms = dssWLCmoments(del,eb,g,epari,eperpi,eta,getR4c) +% -------------------------- +% get the loworder moment components of the dssWLC with the given +% parameters +% R2l, R2c are linear and constant components of , repectively +% R4l is the linear component of +% if getR4c is present and true, also get the constant components of R^4 +% --------------------------- + +if (nargin<7) + getR4c = 0; +end + +alpha = eta^2*eb*eperpi; +ec=-eta*eb; +% inverse epsilon hat +eperphi = 1/(1/eperpi + eta^2*eb); + +LMAX=4; +[xivals,tmp] = expandFsph(del,eb,alpha,LMAX); +M0=1; +M1 = xivals(2); M2 = xivals(3); M3 = xivals(4); M4 = xivals(5); + +% -------------- +%% coupling coefficients +% go up one with D10 +alj = @(l,j) sqrt(3*(l-j)*(l+j)/((2*l+1)*(2*l-1))); +% go up one in both l and j with D11 +ahlj = @(l,j) sqrt(3/2)*sqrt((l+j)*(l+j-1)/((2*l-1)*(2*l+1))); +% stay in place with D20 +blj = @(l,j) sqrt(5)*(l^2+l-3*j^2)/((2*l-1)*(2*l+3)); +% go up 2 with D20, for j=0 +bhlj = @(l,j) 3*sqrt(5)/2/(2*l-1)*sqrt((j-l)*(j-l+1)*(j+l)*(j+l-1)/((2*l+1)*(2*l-3))); +% go up one with D30 +clj = @(l,j) -sqrt(7)*3/2*(1+5*j^2-l^2)/((2*l-3)*(2*l+3))*alj(l,j)/sqrt(3); +% stay put with D40 +dlj = @(l,j) 9/4*(35*j^4 + 3*(l-1)*l*(l+1)*(l+2) - 5*j^2*(6*l^2+6*l-5))... + /((2*l-3)*(2*l-1)*(2*l+3)*(2*l+5)); +dhlj = @(l,j) 15/2*(l^2-l-7*j^2-2)/((2*l-5)*(2*l-1)*(2*l+3))*sqrt((j-l)*(j-l+1)*(j+l)*(j+l-1)/((2*l+1)*(2*l-3))); +% ---------- +% get individual diagram steps + +% single derivatives + +% get s01 (step up from 0 to 1, X10 in the notes) +s01= -i/sqrt(27)*ec*eperphi*(2*M0 + 2*sqrt(5)*M2*blj(1,1)) + i*del*g/sqrt(3)*M1; + +% get s10 (step down from 1 to 0, X01 in the notes) +s10 = i*del*g/sqrt(3)*M0; + +% s12 (step up from 1 to 2, X21 in the notes) +s12 = -i*ec/(3*sqrt(5))*eperphi*(2*sqrt(3)*alj(2,1)^2*M1 + 2*sqrt(7)*clj(2,1)*alj(2,1)*M3) ... + + i*del*g/sqrt(3)*alj(2,0)*bhlj(2,0)*M2; + +tmp1 = i*del*g/sqrt(3)*alj(2,0)*bhlj(2,0)*M2; +%s21 (step down from 2 to 1, X12 in notes) +s21 = -2*i*ec/(3*sqrt(3))*eperphi*(blj(1,1)*M0 + blj(1,1)^2*sqrt(5)*M2)... + + i*del*g/sqrt(3)*blj(1,0)*M1; +tmp2= i*del*g/sqrt(3)*blj(1,0)*M1; +%------------- +% double derivatives +s00 = M0*(-del^2*g^2/3*alj(1,0) - 2*ec^2/9*eperphi^2*ahlj(1,1)^2 - 2/3*(del/2*epari + del*eperphi)) ... + +2*ec^2/9*eperphi^2*sqrt(5)*M2*bhlj(2,0)*ahlj(2,0)*ahlj(1,1); + +s11 = 4*del*g*ec/9*eperphi*alj(2,1)^2*(M0 + blj(1,1)*sqrt(5)*M2) ... + - 2*ahlj(2,0)^2*ec^2*eperphi^2/9*alj(2,0)*(alj(2,0)*M1 + clj(2,0)*M3*sqrt(7/3)) ... + + (-del^2*g^2/3*alj(2,0) + ec^2/9*eperphi^2*2*ahlj(1,1)*ahlj(2,0) - 2/3/sqrt(5)*del*(epari-eperphi))*alj(2,0)*M1 ... + + 2*ec^2/9*eperphi^2*ahlj(2,0)*ahlj(1,1)*(alj(2,0)*M1+clj(2,0)*M3*sqrt(7/3))... + +(-del^2*g^2/3*alj(1,0) - 2*ahlj(1,1)^2*ec^2/9*eperphi^2 - 2*del/3*(epari/2+eperphi))*M1; + +s02 = -2/9*ec^2*eperphi^2*ahlj(2,2)^2 *(dlj(2,2)*M4*sqrt(9/5) + blj(2,2)*M2+M0/sqrt(5)) ... + - 2/9*ec^2*eperphi^2*ahlj(2,0)^2*(dlj(2,0)*M4*sqrt(9/5)+blj(2,0)*M2+M0/sqrt(5)) ... + +4/3/sqrt(15)*del*g*ec*eperphi*alj(2,1)*(alj(2,1)*M1*sqrt(3) + clj(2,1)*M3*sqrt(7)) ... + +(-del^2*g^2*alj(2,0)/3 + 2*ec^2/9*eperphi^2*ahlj(1,1)*ahlj(2,0) - 2*del/3/sqrt(5)*(epari-eperphi))*M2; + +s20 = (-del^2*g^2*alj(2,0)/3 + 2*ec^2/9*eperphi^2*ahlj(1,1)*ahlj(2,0) - 2*del/3/sqrt(5)*(epari-eperphi))*bhlj(2,0)*M0 ... + - 2*ec^2/9*eperphi^2*ahlj(2,0)^2*bhlj(2,0)^2*M2*sqrt(5); + +% ------------- +% triple derivatives + +v0010 = -i*del^3*g^3/3/sqrt(3)*(alj(2,0)^2+alj(1,0)^2) - i*6*del*g*ec^2/9/sqrt(3)*eperphi^2*(-ahlj(2,0)*alj(2,0)*ahlj(1,1)+ahlj(1,1)^2*alj(1,0)) ... + - 6*i*del^2*g/3/sqrt(3)*(epari/2+eperphi) - 6*i*del^2*g/3/sqrt(15)*(epari-eperphi) *alj(2,0); +v2010 = -i*6*del*g*ec^2/9/sqrt(3)*eperphi^2*(ahlj(2,0)^2*alj(2,0) - ahlj(1,1)*alj(1,0)*ahlj(2,0)); +v1111 = 3*i*ec^3/27*eperphi^3*(-ahlj(2,0)^2-ahlj(1,1))^2+3*i*del^2*g^2*ec/9*eperphi*(alj(1,0)-alj(2,0)*ahlj(2,0)) ... + +6*i*ec*del/9*eperphi*(epari/2+eperphi)-6*i*ec*del/9/sqrt(5)*eperphi*(epari-eperphi)*ahlj(2,0); +v3111 = 3*i*ec^3/27*eperphi^3*(-ahlj(2,0)^2-ahlj(1,1))*ahlj(2,0)*ahlj(3,1); + +%MRT3(ljind(3,-1),ljind(1,-1))/(8*pi^2) + +t01 = 2/sqrt(3)*v1111*(M0+blj(1,1)*M2*sqrt(5)) + 2/sqrt(3)*v3111*(bhlj(3,1)*M2*sqrt(5)+dhlj(3,1)*M4*sqrt(9)) ... + +v2010*(alj(2,0)*M1+bhlj(3,0)*M3*sqrt(7/3)) + v0010*M1; + +t10 = M0*v0010 + bhlj(2,0)*M2*sqrt(5)*v2010; + +% ----------------------- +% quadruple derivatives +v0000 = 6*ec^4/81*eperphi^4*(ahlj(2,2)^2*ahlj(1,1))^2 ... + + del^4*g^4/9*(alj(2,0)^2*alj(1,0)+alj(1,0)^3) ... + + 12*del^2*g^2*ec^2/27*eperphi^2*(-alj(1,0)*ahlj(1,1)^2 + alj(2,0)*ahlj(2,0)*ahlj(1,1))*-ahlj(1,1)... + + 12*del^2/9*(epari/2+eperphi)^2 + 12*del^2/45*(epari-eperphi)^2*bhlj(2,0) ... + + 12*del/3*(epari/2+eperphi)*(del^2*g^2/3*alj(1,0)+2*ec^2/9*eperphi^2*ahlj(1,1)^2) ... + + 12*del/3/sqrt(5)*(epari-eperphi)*(del^2*g^2/3*alj(2,0)-2*ec^2/9*eperphi^2*ahlj(2,0)*ahlj(1,1))*bhlj(2,0); + +v2000 = 6*ec^4/81*eperphi^4 *ahlj(2,2)^2*ahlj(1,1)*(-ahlj(2,2)^2*ahlj(2,0) - ahlj(2,2)*ahlj(3,-1)*ahlj(3,1)) ... + + 12*del^2*g^2*ec^2/27*eperphi^2*(-alj(1,0)*ahlj(1,1)^2 + alj(2,0)*ahlj(2,0)*ahlj(1,1))*ahlj(2,0) ... + -24*del/27*(epari/2+eperphi)*ec^2*eperphi^2*ahlj(2,0)*ahlj(1,1) + 24*del*ec^2/27/sqrt(5)*eperphi^2*(epari-eperphi)*ahlj(2,0)^2*bhlj(2,0); + +v4000 = 6*ec^4/81*eperphi^4*ahlj(2,2)^2*ahlj(1,1)*ahlj(2,2)*ahlj(3,-1)*ahlj(4,0); + +%MRT4(ljind(4,0),1)/(8*pi^2) + +q00 = M0*v0000 + M2*sqrt(5)*v2000 + M4*sqrt(9)*v4000; + +% % ------------------------- +% %first level diagrams + + R2l = 2*s01*s10/(M1-1)/del - s00/del; + R2c = 2*s01*s10/(M1-1)^2; +% +% ------------------ +% second level diagrams + +X1 = -1/2*(M1-5)/(M1-1)^3*s01^2*s10^2; +X2 = 1/2*(M1-3)/(M1-1)^2*s00*s01*s10; +X3 = -1/2*s00^2; +X4 = -1/((M1-1)^2*(M2-1))*s01*s12*s21*s10; +X5 = 1/(M1-1)^2*s01*s11*s10; +X6 = 1/((M1-1)*(M2-1))*s02*s21*s10; +X7 = 1/((M1-1)*(M2-1))*s01*s12*s20; +X8 = -1/(M2-1)*s02*s20; +X9 = 1/(1-M1)*t01*s10; +X10 = 1/(1-M1)*s01*t10; +X11 = q00; + +X1c = 3/(M1-1)^4*s01^2*s10^2; +X2c = - 1/(M1-1)^3*s00*s01*s10; +X4c = - (3+M2*(M1-2)-2*M1+M1*(-2+M2+M1))/((M1-1)^4*(M2-1)^2)*s01*s12*s21*s10; +X5c = 2/(M1-1)^3*s01*s11*s10; +X6c = (-2+M1+M2)/((M1-1)^2*(M2-1)^2)*s02*s21*s10; +X7c = (-2+M1+M2)/((M1-1)^2*(M2-1)^2)*s01*s12*s20; +X8c = -1/(M2-1)^2*s02*s20; +X9c = -1/(1-M1)^2*t01*s10; +X10c = -1/(1-M1)^2*s01*t10; + +R4l = 1/del*(24*X1+24*X2+6*X3+24*X4+12*X5+12*X6+12*X7+6*X8+4*X9+4*X10+X11); + +if (getR4c) + R4c = (24*X1c+24*X2c+24*X4c+12*X5c+12*X6c+12*X7c+6*X8c+4*X9c+4*X10c); + moms = [R2l,R2c,R4l,R4c]; +else + moms = [R2l,R2c,R4l]; +end +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/dssWLCparams.txt b/BasicWLC/dssWLC/getparams/dssWLCparams.txt new file mode 100644 index 00000000..b857acb0 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/dssWLCparams.txt @@ -0,0 +1,60 @@ +0.01 1.3893 0.99891 1.2604e+05 2.3725e+05 259.11 2.4113e-06 0.00021121 +0.011721 1.4546 0.99866 75387 1.7732e+05 237.2 3.2206e-06 0.00024121 +0.013738 1.5065 0.99839 48282 1.3227e+05 213.08 4.3181e-06 0.00027605 +0.016103 1.517 0.99785 33576 74999 161.89 6.226e-06 0.0004158 +0.018874 1.5405 0.99741 23265 53018 138.51 8.5491e-06 0.00050227 +0.022122 1.5481 0.99677 16573 34412 112.43 1.2038e-05 0.00066107 +0.025929 1.5649 0.99624 11822 26073 99.205 1.6292e-05 0.00074517 +0.030392 1.568 0.99546 8600 17961 82.81 2.2633e-05 0.00092434 +0.035622 1.5848 0.99459 6142.9 12924 71.288 3.0994e-05 0.0010979 +0.041753 1.5832 0.99317 4444.8 8078.5 56.614 4.4159e-05 0.0015028 +0.048939 1.5818 0.9923 3342.2 6387 50.61 5.8957e-05 0.0016245 +0.057362 1.5742 0.99074 2502.5 4388.2 42.047 8.2134e-05 0.0020237 +0.067234 1.5765 0.98907 1854.7 3168.7 36.085 0.00011275 0.0023991 +0.078805 1.5733 0.98675 1383.9 2152.3 29.964 0.0001572 0.0030276 +0.092367 1.5734 0.98426 1036 1528 25.531 0.00021616 0.003657 +0.10826 1.5729 0.98127 779.72 1081.5 21.753 0.0002966 0.0044347 +0.1269 1.5746 0.97806 589.76 793.29 18.939 0.00040114 0.0051922 +0.14874 1.5726 0.97366 449.26 548.77 16.003 0.00055133 0.0064618 +0.17433 1.5727 0.96886 344.63 392.95 13.816 0.00075187 0.0077757 +0.20434 1.5722 0.963 266.69 277.82 11.881 0.0010247 0.0094976 +0.2395 1.5716 0.95609 208.6 196.27 10.244 0.0013892 0.011636 +0.28072 1.5707 0.94807 165.31 139.31 8.8783 0.0018677 0.014224 +0.32903 1.5677 0.93875 133.36 98.947 7.7017 0.0025008 0.017427 +0.38566 1.5622 0.92778 109.54 70.004 6.6581 0.003371 0.021516 +0.45204 1.5539 0.91541 91.402 50.234 5.7717 0.0045193 0.026276 +0.52983 1.5417 0.90171 77.102 36.91 5.0121 0.006012 0.031445 +0.62102 1.5252 0.8863 65.188 27.777 4.3277 0.007935 0.036899 +0.7279 1.5055 0.87001 54.418 22.103 3.7488 0.010551 0.041058 +0.85317 1.4842 0.85273 44.35 18.722 3.2384 0.013947 0.043049 +1 1.4646 0.83456 35.107 17.067 2.777 0.01824 0.042062 +1.1 1.4614 0.81725 28.894 14.733 2.5829 0.021131 0.046192 +1.2 1.4574 0.8004 24.338 12.987 2.4284 0.023932 0.05008 +1.3 1.4527 0.784 20.921 11.625 2.3012 0.026973 0.053826 +1.4 1.4475 0.76795 18.303 10.513 2.1923 0.029911 0.057605 +1.5 1.4419 0.75181 16.268 9.5129 2.0895 0.032785 0.061993 +1.6 1.4359 0.73685 14.626 8.7798 2.0115 0.035564 0.065555 +1.7 1.4296 0.72254 13.289 8.1802 1.9459 0.038584 0.06887 +1.8 1.4231 0.70851 12.192 7.6397 1.8848 0.041468 0.072433 +1.9 1.4164 0.69505 11.274 7.182 1.8318 0.044228 0.075846 +2 1.4096 0.68218 10.497 6.7923 1.7857 0.046899 0.079091 +2.1 1.4026 0.6698 9.8323 6.451 1.7446 0.049515 0.082269 +2.2 1.3956 0.65784 9.2594 6.1463 1.7072 0.052135 0.085446 +2.3 1.3885 0.64653 8.7584 5.8914 1.6757 0.054898 0.088278 +2.4 1.3813 0.63527 8.3235 5.6333 1.6428 0.057573 0.09164 +2.5 1.3741 0.62487 7.9343 5.4357 1.6179 0.060118 0.094231 +2.6 1.3668 0.61464 7.5907 5.2407 1.5929 0.062599 0.097132 +2.7 1.3596 0.60485 7.2828 5.0681 1.5706 0.065009 0.099877 +2.8 1.3523 0.59536 7.0066 4.907 1.5496 0.067367 0.10267 +2.9 1.3451 0.58635 6.7559 4.7683 1.5316 0.069675 0.10517 +3 1.3379 0.57756 6.5292 4.6351 1.5142 0.071953 0.10779 +3.1 1.3306 0.5692 6.3217 4.5195 1.4992 0.074199 0.11015 +3.2 1.3234 0.56102 6.1328 4.406 1.4843 0.076506 0.11267 +3.3 1.3163 0.55317 5.9589 4.3044 1.4711 0.078846 0.11503 +3.4 1.3091 0.54549 5.7994 4.2044 1.4578 0.08112 0.11755 +3.5 1.302 0.53834 5.6505 4.1258 1.4481 0.083326 0.11948 +3.6 1.2949 0.53106 5.5145 4.0338 1.4357 0.085487 0.12209 +3.7 1.2879 0.52432 5.3866 3.9633 1.427 0.087592 0.12403 +3.8 1.2809 0.51755 5.2686 3.8851 1.4167 0.089657 0.12644 +3.9 1.274 0.51124 5.1574 3.8235 1.4093 0.091681 0.12829 +4 1.2671 0.50516 5.0532 3.7671 1.4026 0.093672 0.13003 diff --git a/BasicWLC/dssWLC/getparams/dssWLCstructFact.m b/BasicWLC/dssWLC/getparams/dssWLCstructFact.m new file mode 100644 index 00000000..c07fe019 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/dssWLCstructFact.m @@ -0,0 +1,208 @@ +% stuff for testing only +% load('lengthscales.mat') +% dc = 15; del = dellist(dc); +% [lp,g,epari,eperpi,ec,err,plen] = discreteWLCshearParams(del,Xminvals(dc)); +% eperpi = 1/(1/eperpi-ec^2/lp); +% eb = lp; +% eta = -ec/eb; +function [Svals,LMAX] = dssWLCstructFact(klist,del,eb,g,epari,eperpi,eta,Ycouple,Ltot,LMAXin) + +%% +% --------- +% Find the structure factor for a dssWLC model +% ---------- + + +pmax = 10; % maximum power to which exponential is expanded +nk = length(klist); + +eperpih = 1/(1/eperpi + eta^2*eb); +alpha = eta^2*eb*eperpi; + +%% +% expand F in terms of spherical harmonics +if (eperpi==0) + % non-shearable WLC, do direct projection using plane wave decomposition + for c = 0:LMAXin + xivals(c+1) = besseli(c+0.5,eb/del)/besseli(0.5,eb/del); + end +else + xivals = expandFsph(del,eb,alpha,LMAXin); +end + +LMAX=LMAXin; +% cut off LMAX such that xi values are decreasing +% tmp = diff(abs(xivals)); +% ind = find(tmp>0); +% if (length(ind)>0) +% LMAX = ind(1)-1; +% xivals = xivals(1:LMAX+1); +% else +% LMAX=LMAXin; +% end +%% +Imax = ljind(LMAX,LMAX); +% ---- +%% get the coefficients h_a,b^j for the spherical harmonic expansion of +% exp(H) just for 1 specific k value, in order to find the nonzero elements +% in the sparse matrices +%Hmat(a,b) has the coefficient for Y_a*(u0hat) Y_b(uhat) +% basically we're working in the linear space of pairs of Y functions + +k = klist(end); + +% get the coefficients for pairs of Y in the H matrix +Hmat = sparse(zeros(Imax,Imax)); +Hmat(ljind(1,0),1) = i*k*del*g*4*pi/sqrt(3); +Hmat(ljind(2,0),1) =-k^2*del/3*4*pi/sqrt(5)*(epari - eperpih); +Hmat(1,1) = -k^2*del/2*eperpih*4*pi + Hmat(ljind(2,0),1)*sqrt(5)/2; +Hmat(ljind(1,1),ljind(1,1)) = eta*eb*eperpih*i*k*4*pi/3; +Hmat(ljind(1,-1),ljind(1,-1)) = eta*eb*eperpih*i*k*4*pi/3; + +% get the spherical harmonic expansion coefficients for exp(H) by expanding the exponential as a +% power series in the Ys (accurate for small k) + +% Hpow contains the sph harmonic expansion of H to +% different powers +Hpow = {}; +% 0th power +Hpow{1} = sparse(zeros(Imax,Imax)); +Hpow{1}(1,1) = 4*pi; + +% 1st power +Hpow{2} = Hmat; + +[a1list,b1list,vals1] = find(Hmat); +nv1= length(a1list); + +% coefficients for the exp(H) matrix +expHmat = Hpow{1}; +if (pmax>=2) + expHmat = expHmat + Hpow{2}; +end + +for p = 2:pmax + Hpow{p+1} = sparse(zeros(Imax,Imax)); + [a2list,b2list,vals2] = find(Hpow{p}); + nv2 = length(a2list); + for c1 = 1:nv1 + aind1 = a1list(c1); + bind1 = b1list(c1); + for c2 = 1:nv2 + aind2 = a2list(c2); + bind2 = b2list(c2); + % product of 2 pairs of sph harmonics, expand into a asum over + % single pairs + Hpow{p+1} = Hpow{p+1} + vals1(c1)*vals2(c2)*transpose(Ycouple{aind1}(aind2,1:Imax))*Ycouple{bind1}(bind2,1:Imax); + end + end + + expHmat = expHmat + 1/factorial(p)*Hpow{p+1}; + +end + + +%% get M tensor elements, independent of k value (so long as nonzero +% form of expHmat remains the same) +%Mmat{c}(l,l0) is the value for the c-th pair of a,j and b,j indices + +[aind,bind,vals] = find(expHmat); + +Mmat={}; +for c = 1:length(aind) + %[c, size(Mmat), length(aind)] + a = aind(c); b = bind(c); + [al,aj] =ljindinv(a); [bl,bj] = ljindinv(b); + + Mmat{c} = sparse(zeros(LMAX+1,LMAX+1)); + + for l0 = 0:LMAX + [lind,tmp,al0vals] = find(Ycouple{ljind(l0,0)}(1:Imax,a)); + + for lc = 1:length(lind) + [ll,tmp] = ljindinv(lind(lc)); + + for lam = max(0,abs(bl-ll)):min(LMAX,bl+ll) + tmp = Ycouple{b}(ljind(lam,0),ljind(ll,bj)); + if (abs(tmp)>0) + Mmat{c}(ll+1,l0+1) = Mmat{c}(ll+1,l0+1) + tmp*al0vals(lc)... + *xivals(lam+1)*sqrt((2*lam+1)/(2*ll+1)); + end + end + end + end +end + +%% get overall structure factor, recalculating h_a,b^j for each specific k +% value +for kc = 1:nk + + k = klist(kc); + + % get the coefficients for pairs of Y in the H matrix + Hmat = sparse(zeros(Imax,Imax)); + Hmat(ljind(1,0),1) = i*k*del*g*4*pi/sqrt(3); + Hmat(ljind(2,0),1) =-k^2*del/3*4*pi/sqrt(5)*(epari - eperpih); + Hmat(1,1) = -k^2*del/2*eperpih*4*pi + Hmat(ljind(2,0),1)*sqrt(5)/2; + Hmat(ljind(1,1),ljind(1,1)) = eta*eb*eperpih*i*k*4*pi/3; + Hmat(ljind(1,-1),ljind(1,-1)) = eta*eb*eperpih*i*k*4*pi/3; + + % get the spherical harmonic expansion coefficients for exp(H) by expanding the exponential as a + % power series in the Ys (accurate for small k) + + % Hpow contains the sph harmonic expansion of H to + % different powers + Hpow = {}; + % 0th power + Hpow{1} = sparse(zeros(Imax,Imax)); + Hpow{1}(1,1) = 4*pi; + + % 1st power + Hpow{2} = Hmat; + + [a1list,b1list,vals1] = find(Hmat); + nv1= length(a1list); + + % coefficients for the exp(H) matrix + expHmat = Hpow{1}; + if (pmax>=2) + expHmat = expHmat + Hpow{2}; + end + + for p = 2:pmax + Hpow{p+1} = sparse(zeros(Imax,Imax)); + [a2list,b2list,vals2] = find(Hpow{p}); + nv2 = length(a2list); + for c1 = 1:nv1 + aind1 = a1list(c1); + bind1 = b1list(c1); + for c2 = 1:nv2 + aind2 = a2list(c2); + bind2 = b2list(c2); + % product of 2 pairs of sph harmonics, expand into a asum over + % single pairs + Hpow{p+1} = Hpow{p+1} + vals1(c1)*vals2(c2)*transpose(Ycouple{aind1}(aind2,1:Imax))*Ycouple{bind1}(bind2,1:Imax); + %Hpow{p+1} = Hpow{p+1} + vals1(c1)*vals2(c2)*transpose(Ycoupleflip{aind1}(1:Imax,aind2))*Ycoupleflip{bind1}(1:Imax,bind2); + end + end + + expHmat = expHmat + 1/factorial(p)*Hpow{p+1}; + end + + % overall matrix of g coefficients + [aind,bind,vals] = find(expHmat); + gcoeff = zeros(LMAX+1,LMAX+1); + + for c = 1:length(aind) + gcoeff = gcoeff + Mmat{c}*vals(c); + end + + % number of segments + nseg = Ltot/del; + + % now find the structure factor + I = eye(LMAX+1); + gtot = ((nseg+1)*I+gcoeff^(nseg+2) - gcoeff*(nseg+2))*inv(gcoeff-I)^2; + Svals(kc) = 2*gtot(1,1)/(nseg+1)^2; + +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/expandFsph.m b/BasicWLC/dssWLC/getparams/expandFsph.m new file mode 100644 index 00000000..2e69625a --- /dev/null +++ b/BasicWLC/dssWLC/getparams/expandFsph.m @@ -0,0 +1,87 @@ +function [xivals,tmp] = expandFsph(del,eb,alpha,LMAX) +% for the dssWLC model structure factor and moment calculations, +% expand the function F(uhat) in terms of spherical harmonics of uhat +% del is the discretization length +% eb is the bending modulus +% eperpi is 1/shear modulus +% eta is the bend-shear coupling +% WARNING: this becomes unstable at higher indices for higher eperpih + +a = eb/del; +b = alpha*eb/(1+alpha)/2/del; +tmp = b/a^2; +Ivals = zeros(LMAX+1,1); + +%for n = 0:LMAX +% Ivals(n+1) = quad(@(x) x.^n.*exp(a*x-b*x.^2),-1,1,1e-12); +%end +% +% %% + +cutoff = 0.05e-2; +%[b/a^2, cutoff] +% below this cutoff, use an expansion of the quadratic part of the integral +if (b/a^2 < cutoff) + %% + % get the J integrals (incomplete gamma functions) + % rescale all J by multiplying by exp(-a)/a^m + pmax = ceil(log(eps)/log(b/a^2)+5); % maximum power to go to + indmax = 2*pmax+LMAX; + Jvals = zeros(2*pmax+LMAX+1,1); + Jvals(1) = (1 - exp(-2*a)); + for m = 1:indmax + Jvals(m+1) = -m/a*Jvals(m) + (1-(-1)^m*exp(-2*a)); + end + + % get the I_n integrals, multiplied by exp(-a) + ks = 0:pmax; + for n = 0:LMAX + Ivals(n+1) = sum(1/a*(-1).^(ks).*b.^ks.*Jvals(n+2*ks+1)'./factorial(ks)); + end +% %% +else + %% +% for n = 0:LMAX +% Ivals(n+1) = quad(@(x) x.^n.*exp(a*x-b*x.^2),-1,1,1e-16); +% end +% end + % more asymptotics to avoid bad erf values + cutoff2 = 4.5; + if ((a-2*b)/2/sqrt(b) 21 + + +tic +% maximal indices +Imax = ljind(LMAX,LMAX); +Imax3 = ljind(2*LMAX,2*LMAX); +% set up an array of sparse matrices +W3Jsparse = cell(Imax,1); +for ind1 = 1:Imax + W3Jsparse{ind1} = sparse(zeros(Imax,Imax3)); + Ycouple{ind1} = sparse(zeros(Imax,Imax3)); +end + +%% pretabulate factorials +factsave = zeros(4*LMAX+1,1); +for c = 1:4*LMAX+1 + factsave(c) = factorial(c); +end +%% +% get the Wigner3j coefficients +for l1 = 0:LMAX + l1 + for j1 = -l1:l1 + ind1 = ljind(l1,j1); + [l1,j1] + + for l2 = 0:LMAX + for j2 = -l2:l2 + ind2 = ljind(l2,j2); + + for l3 = abs(l1-l2):l1+l2 + j3 = j1+j2; + if abs(j3)>l3 + continue + end + ind3 = ljind(l3,j3); + if (mod(l1+l2+l3,2)>0); continue; end + + W3Jsparse{ind1}(ind2,ind3) = Wigner3j(l1,l2,l3,j1,j2,-j3,factsave); + end + end + end + end +end +toc + +% ----------------------- +%% tabulate coupling coefficients +tic +Imax = ljind(LMAX,LMAX); + +for l1 = 0:LMAX + l1 + for j1 = -l1:l1 + ind1 = ljind(l1,j1); + for l2 = 0:LMAX + for j2 = -l2:l2 + ind2 = ljind(l2,j2); + + for l3 = abs(l1-l2):min(LMAX,l1+l2) + j3 = j1+j2; + if abs(j3)>l3 + continue + end + ind3 = ljind(l3,j3); + if (mod(l1+l2+l3,2)>0); continue; end + + C1 = W3Jsparse{ljind(l1,0)}(ljind(l2,0),ljind(l3,0)); + C2 = W3Jsparse{ind1}(ind2,ind3); + + Ycouple{ind1}(ind2,ind3) = sqrt((2*l1+1)*(2*l2+1)*(2*l3+1)/(4*pi))... + *(-1)^(j1+j2)*C1*C2; + end + end + end + end +end +toc + +if (nargin>1) + save(savefile,'LMAX','Imax','Imax3','Ycouple','W3Jsparse') +end +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/ljind.m b/BasicWLC/dssWLC/getparams/ljind.m new file mode 100644 index 00000000..dec2e9a5 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/ljind.m @@ -0,0 +1,7 @@ +function ind = ljind(l,j) +if (abs(j)<= l) + ind = l^2+j+l+1; +else + ind = 0; +end +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/ljindinv.m b/BasicWLC/dssWLC/getparams/ljindinv.m new file mode 100644 index 00000000..94919e7c --- /dev/null +++ b/BasicWLC/dssWLC/getparams/ljindinv.m @@ -0,0 +1,11 @@ +function [l,j] = ljindinv(a) +% for indexing wigner functions where the m index is ignored +% returns the l,j indices corresponding to the effective single index a + +if (a<=0) + l=NaN;j=NaN; +else + l = floor(sqrt(a-1)); + j = a - l^2-l-1; +end +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/shearWLCgetAmat.m b/BasicWLC/dssWLC/getparams/shearWLCgetAmat.m new file mode 100644 index 00000000..fe56992b --- /dev/null +++ b/BasicWLC/dssWLC/getparams/shearWLCgetAmat.m @@ -0,0 +1,28 @@ +function A = shearWLCgetAmat(k,eb,g,epari,ephi,eta,LMAX) +% get the A matrix for a continuous shearable WLC at a particular k value +% uses parameters as defined in the manuscript + +lp = eb/(1+eta^2*eb*ephi); + +alj = @(l,j) sqrt((l-j)*(l+j)/((2*l-1)*(2*l+1))); +blj = @(l,j) alj(l,j)*alj(l-1,j); +clj = @(l,j) alj(l,j)^2 + alj(l+1,j)^2; +A = zeros(LMAX+1,LMAX+1); +for l = 0:LMAX + lind=l+1; + A(lind,lind) = l*(l+1)/2/lp +k^2/2*ephi*(1-clj(l,0)) + k^2/2*epari*clj(l,0); + if (l < LMAX) + A(lind,lind+1) = -i*g*k*alj(l+1,0) - i*k*eta*ephi*l*alj(l+1,0); + end + if (l>0) + A(lind,lind-1) = -i*g*k*alj(l,0) + i*k*eta*ephi*(l+1)*alj(l,0); + end + if (l < LMAX-1) + A(lind,lind+2) = -k^2/2*ephi*blj(l+2,0) + k^2/2*epari*blj(l+2,0); + end + if (l>1) + A(lind,lind-2) = -k^2/3*ephi*blj(l,0) + k^2/2*epari*blj(l,0); + end +end + +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/shearWLCpropagator.m b/BasicWLC/dssWLC/getparams/shearWLCpropagator.m new file mode 100644 index 00000000..e0db4473 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/shearWLCpropagator.m @@ -0,0 +1,23 @@ +function M = shearWLCpropagator(k,L,lp,g,epari,ephi,eta,LMAX) +% get structure factor at a particular k value +% for a shearable WLC +% = InverseLaplace(G(k,p)) +% get the propagator matrix for a shearable WLC of length L + +% get the matrix +A = shearWLCgetAmat(k,lp,g,epari,ephi,eta,LMAX); +% get the poles +evals = eig(-A); +[tmp1,tmp2] = sort(real(evals),'descend'); +evals = evals(tmp2); + +% get the exponential components +M = zeros(LMAX+1,LMAX+1); +for ec = 1:LMAX+1 + cA = cofactor(evals(ec)*eye(LMAX+1)+A); + p = evals(ec); + expterm = cA/(prod(p-evals(1:ec-1))*prod(p-evals(ec+1:end))); + M = M + expterm*exp(evals(ec)*L); +end + +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/ssWLCdynamics.m b/BasicWLC/dssWLC/getparams/ssWLCdynamics.m new file mode 100644 index 00000000..318c3b1a --- /dev/null +++ b/BasicWLC/dssWLC/getparams/ssWLCdynamics.m @@ -0,0 +1,45 @@ +function [evals,evecs,pareval,Amat] = ssWLCdynamics(eb,g,epar,eperph,eta,L,xir,xiu,pmax) +% get the eigenvalues and eigenvectors for continuous shearable WLC +% dynamics, using mode decomposition of the coupled shear and bend +% pareval is the eigenvalue for stretch + +if (nargin<9) + pmax = 100; +end + +Amat = zeros(2*pmax); +% for each p, lists X1,O2 +for p = 1:pmax + x1i = 2*(p-1)+1; + o2i = 2*(p-1)+2; + + coeff = pi^2*p^2/L^2; + + Amat(x1i,x1i) = -(eperph/xir*coeff + g^2*eperph/xiu); + Amat(x1i,o2i) = eta*eb/xir*coeff+eta*eb*g^2/xiu; + Amat(o2i,o2i) = (-eb/xiu*coeff); + Amat(o2i,x1i) = eta*eb/xiu*coeff; + + for pp = 1:pmax + if (mod(pp+p,2)==1) + x1ip = 2*(pp-1)+1; + o2ip = 2*(pp-1)+2; + + tmp = 4*g/L/xiu*(p*pp)/(p^2-pp^2); + + Amat(x1i,x1ip) = Amat(x1i,x1ip) +tmp*eta*eb; + Amat(x1i,o2ip) = Amat(x1i,o2ip) -tmp*eb; + Amat(o2i,o2ip) = Amat(o2i,o2ip) -tmp*eta*eb; + Amat(o2i,x1ip) = Amat(o2i,x1ip) +tmp*eperph; + % [p,pp,x1i,o2ip,o2i,x1ip, Amat(x1i,o2ip),Amat(o2i,x1ip)] + end + end +end +[V,E] = eig(Amat); E = diag(E); +[a,b] = sort(real(E)); +evals = E(b); +evecs = V(:,b); + +pareval = -epar/xir*pi^2/L^2; + +end \ No newline at end of file diff --git a/BasicWLC/dssWLC/getparams/tabulateparams.m b/BasicWLC/dssWLC/getparams/tabulateparams.m new file mode 100644 index 00000000..27d544c2 --- /dev/null +++ b/BasicWLC/dssWLC/getparams/tabulateparams.m @@ -0,0 +1,115 @@ +%----------------------------------------------- +% Tabulate the dssWLC energetic parameters for del=0.01 to del=1 +% Optimizing over alpha to get minimal length scale of accuracy +% delvals = delta values +% Resulting parameters are in: ebvals, gvals, eparvals, eperpvals, etavals, +% alphavals +% Structure factor for dssWLC with delta=delvals(dc), for wavevectors klist(dc,:) +% are in Svals(dc,:) +% Corresponding structure factor for continuous chain is in Splain(dc,:) +% Structure factor errors are in errvals(dc,:) +% Length scales of accuracy are in: lscales +% Results are saved in dssWLCparams.mat +% ----------------------------------------------- +LMAX=20; +Ycouple = getYcouple(LMAX,'YcoupleSave.mat') +delvals = logspace(-2,0,30); +nd = length(delvals); +nk = 100; +Ltot = 1000; +cutoff=1e-4; + +LMAXvals = 10*ones(size(delvals)); +LMAXvals(1:10) = 14; + +for dc = 5:5 + del = delvals(dc); + LMAX = LMAXvals(dc); + + klist(dc,:) = logspace(log10(1/del/10),log10(1/del*4),nk); + + % get plain wlc structure factor + nseg = Ltot/del; + I = eye(LMAX+1); + for kc = 1:nk + Mplain = shearWLCpropagator(klist(dc,kc),del,1,1,0,0,0,LMAX); + Mtot = ((nseg+1)*I+Mplain^(nseg+2) - Mplain*(nseg+2))*inv(Mplain-I)^2; + Splain(dc,kc) = 2*Mtot(1,1)/(nseg+1)^2; + end + + options = optimset('Display','iter','TolX',1e-4); + if (dc==1) + alpharange = [0.1,1]; + else + alpharange = [alphavals(dc-1)-0.2,alphavals(dc-1)+0.2]; + end + [alphavals(dc),lscalesave(dc)] = fminbnd(@(alpha) dssWLClengthScale(del,alpha,Ltot,klist(dc,:),Splain(dc,:),Ycouple,cutoff,LMAX),... + alpharange(1),alpharange(2),options); + [lscales(dc),params,Svals(dc,:)] = dssWLClengthScale(del,alphavals(dc),Ltot,klist(dc,:),Splain(dc,:),Ycouple,cutoff,LMAX); + + errvals(dc,:) = abs(Svals(dc,:)-Splain(dc,:))./Splain(dc,:); + ebvals(dc) = params(1); + gvals(dc) = params(2); + eparvals(dc) = 1/params(3); + eperpvals(dc) = 1/params(4); + etavals(dc) = params(5); + + [dc del alphavals(dc) eperpvals(dc)] + + save('dssWLCparams.mat') +end + +%% find energetic params for del>1 using fixed alpha +load('dssWLCparams.mat') +delvals = [delvals,1.1:0.1:4]; +ndtot = length(delvals); +alphaset = alphavals(nd); +for dc = nd+1:ndtot + del = delvals(dc); + [ebvals(dc),gvals(dc),epari,eperpi,etavals(dc),err,plen] = dssWLCminLpParams(del,alphaset); + eparvals(dc) = 1/epari; + eperpvals(dc) = 1/eperpi; + alphavals(dc) = alphaset; + [dc del alphavals(dc) eperpvals(dc)] +end + +%% +% find appropriate xiu value +for dc = 1:ndtot + del = delvals(dc); + eb = ebvals(dc); + gam = gvals(dc); + eperp = eperpvals(dc); + epar = eparvals(dc); + eta = etavals(dc); + + eperph = eperp + eta^2*eb; + xir = 1; + xiulist = logspace(-7,1,50); + L=del; + pval = 1; + tfast = zeros(size(xiulist)); + + for uc = 1:length(xiulist) + xiu = xiulist(uc); + [evals,evecs,pareval] = ssWLCdynamics(eb,gam,epar,eperph,eta,L,xir,xiu,50); + tfast(uc) = -1/evals(end); + end + + dt = diff(log10(tfast)); + lxiu = interp1(dt,log10(xiulist(1:end-1)),(dt(1)+dt(end))/2); + zetauvals(dc) = 10^lxiu; + + % get the appropriate delt + deltsclvals(dc) = 0.5/(eperp*gam^2*del); + + [dc, del, zetauvals(dc), deltsclvals(dc)] +end + +%% +% output a space-delimited look-up table of values + +lastind = length(ebvals); +datamat = [delvals(1:lastind)',ebvals(1:lastind)',gvals(1:lastind)',eparvals(1:lastind)',... + eperpvals(1:lastind)', etavals(1:lastind)',zetauvals(1:lastind)',deltsclvals(1:lastind)']; +dlmwrite('dssWLCparams.txt',datamat,' '); diff --git a/BasicWLC/dssWLC/getparams/testrun.m b/BasicWLC/dssWLC/getparams/testrun.m new file mode 100644 index 00000000..c8a3208f --- /dev/null +++ b/BasicWLC/dssWLC/getparams/testrun.m @@ -0,0 +1,7 @@ +% -------- +%% test all the code for dssWLC calculations +% --------- + +% tabulate coupling coefficients for spherical harmonics +% only have to do this once and then save results +Ycouple = getYcouple(LMAX,'YcoupleSave.mat') \ No newline at end of file diff --git a/BasicWLC/dssWLC/scripts/pdbutils.py b/BasicWLC/dssWLC/scripts/pdbutils.py new file mode 100644 index 00000000..9c581e63 --- /dev/null +++ b/BasicWLC/dssWLC/scripts/pdbutils.py @@ -0,0 +1,450 @@ +# generic objects and utilities for dealing with pdb files +import re +from numpy import * + +# regular expression for an atom in a pdb file +atomR = re.compile('^(ATOM|HETATM) *([0-9]+) *(\S+) +([A-Z]+) +([a-zA-Z]?) *\ +([-0-9]+) *(-?[0-9.]+) *(-?[0-9.]+) *(-?[0-9.]+)(.*$)') + +# regular expression for a biological symmetry transform line +transformR = re.compile('^REMARK +350 +BIOMT[1-3] *(\d+) +(-?[0-9.]+) +(-?[0-9.]+) +(-?[0-9.]+) +(-?[0-9.]+) *$') + + +class Atom: + """This object represents information concerning a single atom""" + def __init__(self,pdbmatch = None,coords = None, name = 'X',num=0): + """Fill in information using a match object from a pdb file""" + if pdbmatch != None: + # base the atom information on a match object from a pdb line + self.type = pdbmatch.group(1) + self.num = int(pdbmatch.group(2)) + self.name = pdbmatch.group(3) + self.res = pdbmatch.group(4).strip() + self.chain = pdbmatch.group(5) + self.resnum = int(pdbmatch.group(6)) + self.x = float(pdbmatch.group(7)) + self.y = float(pdbmatch.group(8)) + self.z = float(pdbmatch.group(9)) + self.coords = array([self.x,self.y,self.z]) + self.occupancy = None + self.bfactor = None + self.tail = pdbmatch.group(10) + + elif coords != None: + # give the atom the desired coordinates and type + self.num = num + self.coords = coords + [self.x,self.y,self.z] = coords + self.name = name + self.res = 'SSN' + self.resnum = 0 + self.chain = 'X' + self.occupancy = 1 + self.bfactor = 1 + self.tail = ' C' + self.type = 'HETATM' + + self.coords = array(self.coords) + self.chainobj = None + self.resobj = None + self.conect = [] + + def __repr__(self): + return "" %(self.num, self.name, self.resnum, self.chain) + + def pdbline(self): + """Get the pdb line corresponding to this atom""" + + if (self.occupancy==None or self.bfactor == None): + line = '%s%5d %s%3s%2s%4d%12.3f%8.3f%8.3f%s\n' \ + %(self.type.ljust(6),self.num,self.name.ljust(4),self.res,self.chain,self.resnum,\ + self.coords[0],self.coords[1],self.coords[2],self.tail) + else: + line = '%s%5d %s%3s%2s%4d%12.3f%8.3f%8.3f%6.2f%6.2f%s\n' \ + %(self.type.ljust(6),self.num,self.name.ljust(4),self.res,self.chain,self.resnum,\ + self.coords[0],self.coords[1],self.coords[2],self.occupancy,self.bfactor,self.tail) + + return line + + def conline(self): + """Get a CONECT line for this atom""" + + str = 'CONECT%5d' %(self.num) + for a in self.conect: + str += '%5d' %a.num + str += '\n' + return str + +class Residue: + """Residue or nucleotide object""" + def __init__ (self,atoms=None): + if atoms == None: + self.atoms = [] + self.num = None + self.chain = None + self.name = None + else: + self.atoms = atoms + self.chain = atoms[0].chain + self.num = atoms[0].resnum + self.name = atoms[0].res + + def __repr__(self): + return "" %(self.num, self.name) + + def getAtomByName(self,name,regexp=0): + """Return the first atom with the given name found in the residue. If regexp is true, then get the atom whose name matches the regular expression""" + if regexp: + rN = re.compile(name) + for a in self.atoms: + if rN.search(a.name) != None: + return a + else: + for a in self.atoms: + if a.name == name: + return a + + return None + +class Chain: + """Chain object""" + def __init__(self,residues = None): + if residues == None: + self.residues=[] + self.name = None + else: + self.residues = residues + self.name = self.residues[0].chain + def __repr__(self): + return "" %self.name + + def fromAtomList(self,atmlist): + # set up a chain from a list of atom objects + # split them up into residues + # raises error if they don't all have the same chain name + + self.residues = [] + self.name = atmlist[0].chain + + start = 0 + for a in atmlist: + if a.chain != self.name: + raise ValueError("Atmlist does not all have the same chain name %s %s" %(self.name, a.chain)) + + if not start or a.resnum!= res.num: + if start: + self.residues.append(res) + res = Residue() + res.name = a.res; res.num = a.resnum + res.chain = a.chain; + res.atoms = [a] + start = 1 + else: + res.atoms.append(a) + + self.residues.append(res) + + return 0 +class BasePair: + """DNA base pair object. Contains 2 residues and a list of atoms""" + def __init__(self,residues = None): + self.atoms = [] + if residues == None: + self.residues = [] + else: + self.residues = residues + for r in residues: + self.atoms.extend(r.atoms) + + if len(self.residues) != 0 and len(self.residues) != 2: + print "WARNING: creating base-pair with neither 0 nor 2 residues" + + def __repr__(self): + return "" %(self.residues[0].name,self.residues[1].name) + +def goodPair(r1,r2): + """Check if two DNA/RNA residues make a correct basepair""" + + return (r1.name[-1] == 'A' and r2.name[-1] == 'T') \ + or (r1.name[-1] == 'T' and r2.name[-1] == 'A') \ + or (r1.name[-1] == 'G' and r2.name[-1] == 'C') \ + or (r1.name[-1] == 'C' and r2.name[-1] == 'G') \ + or (r1.name=='THY' and r2.name=='ADN') \ + or (r1.name=='ADN' and r2.name=='THY') \ + or (r1.name=='CYT' and r2.name=='GUA') \ + or (r1.name=='GUA' and r2.name=='CYT') + +class Structure: + """Class containing an molecule or multi-molecule structure""" + def __init__(self,infile = None): + self.initvars() + + if infile != None: + self.structFromFile(infile) + + def renumRes(self): + """Renumber the residues""" + for c in range(len(self.residues)): + self.residues[c].num = c+1 + for a in self.residues[c].atoms: + a.resnum = c+1 + + def resetFromResidues(self): + # reset the chains and atoms in a structure when the residue list is set + + # rebuild the list of chains + # dictionary mapping chain objects to their names + self.chains = []; + chainnames = {} + + for r in self.residues: + if r.chain in chainnames.keys(): + chainnames[r.chain].residues.append(r) + chainnames[r.chain].atoms.extend(r.atoms) + else: + chainnames[r.chain] = Chain() + self.chains.append(chainnames[r.chain]) + chainnames[r.chain].name = r.chain + chainnames[r.chain].residues = [r] + chainnames[r.chain].atoms = r.atoms[:] + for a in r.atoms: + a.chain = r.chain + + # rebuild atom list + self.atoms = [] + [self.atoms.extend(r.atoms) for r in self.residues] + + def resetFromChains(self): + # reset the residues and atoms based on the chains + + self.residues = []; self.atoms = [] + for c in self.chains: + self.residues.extend(c.residues) + for r in c.residues: + r.chain = c.name + for a in r.atoms: + a.chain = c.name + [self.atoms.extend(r.atoms) for r in c.residues] + + return 0 + + def PCA(self): + """Perform a principal component analysis on the atom coordinates. Returns eigenvals and eigenvecs. Sorted from largest to smallest eigenvalue""" + + M = array([a.coords for a in self.atoms]) + # covariance matrix + covmat = cov(M,rowvar=0) + + # find the eigenvalues and eigenvecs + (eval,evec) = linalg.eig(covmat) + + # sort eval and evec + ind = argsort(-eval) + eval = eval[ind] + evec = evec[:,ind] + + # make sure it forms a right-handed coordinate system + check = dot(cross(evec[:,0],evec[:,1]),evec[:,2]) + + if (check < 0): + ind = [1,0,2] + evec = evec[:,ind] + + return (eval,evec) + + def rotateM(self,M): + """Rotate entire structure by the given rotation matrix""" + + rotmat = matrix(M).T + for a in self.atoms: + a.coords = array(a.coords*rotmat)[0] + + def atomByBum(self,num): + # get the atom of the given number + for a in self.atoms: + if a.num == num: + return a + return None + + def chainByName(self,name): + # get the first chain with the given name + + for c in self.chains: + if c.name==name: + return c + + def initvars(self): + """Initialize various variables""" + + # extra lines at start/end of structure + self.startlines = [] + self.endlines = [] + self.chains = [] + self.residues = [] + self.atoms = [] + + # transformations + self.transforms = [] + + def outputPDB(self,outfile,append=0,ident=1): + # output a pdb file for this structure + # if append then append to the pdb file + # ident is the model identifier to use + + if (append): + OF = open(outfile,'a') + else: + OF = open(outfile,'w') + + OF.write('MODEL %4d\n' %ident) + for l in self.startlines: + OF.write(l) + + if len(self.chains) == 0: + [OF.write(a.pdbline()) for a in self.atoms] + else: + # write in all the chain atoms + for c in self.chains: + for r in c.residues: + for a in r.atoms: + OF.write(a.pdbline()) + #if hasattr(c,'ter'): + # OF.write(c.ter) + + # write in all the extra atoms (not part of chains) + [OF.write(a.pdbline()) for a in self.atoms if a.chainobj == None] + + # write out any conect records + [OF.write(a.conline()) for a in self.atoms if len(a.conect) > 0] + + for l in self.endlines: + OF.write(l) + + OF.write('ENDMDL\n') + OF.close() + + def structFromFile(self,infile): + # given an input file, get structure based on the chains and residues found in that file + # WARNING: for now preserves only direct connectivity information + # no hydrogen bonds or salt bridges + + IF = open(infile) + lines = IF.readlines() + IF.close() + + self.transforms = [] + + started = 0 + for line in lines: + # check for symmetry transform lines + m = transformR.match(line) + if m != None: + tn = int(m.group(1)) + matrow = [float(m.group(i)) for i in range(2,5)] + shift = float(m.group(5)) + if tn > len(self.transforms): + self.transforms.append([[matrow],[shift]]) + else: + self.transforms[tn-1][0].append(matrow) + self.transforms[tn-1][1].append(shift) + self.startlines.append(line) + continue + + m = atomR.match(line) + #m2 = conectR.match(line) + if m == None: + if not started: + self.startlines.append(line) + elif line[:3] == 'TER': + newchain.ter = line + elif line[:6] =='CONECT': + # get the atom to which this record pertains + atm = self.atomByNum(int(line[6:11])) + if atm == None: + print "Cannot find atom number : ", int(line[6:11]) + else: + # get the atoms connected to it (max of 4) + for a in range(4): + str = line[11+5*a:16+5*a] + try: + atm.conect.append(self.atomByNum(int(str))) + except ValueError: + break + else: + self.endlines.append(line) + + continue + newatom = Atom(m) + if not started: + newres = Residue([newatom]) + newchain = Chain([newres]) + self.residues.append(newres) + self.chains.append(newchain) + started = 1 + else: + if newatom.resnum != self.atoms[-1].resnum: + newres = Residue([newatom]) + self.residues.append(newres) + if newatom.chain != self.atoms[-1].chain: + newchain = Chain([newres]) + if newatom.chain.strip() != '': + self.chains.append(newchain) + else: + newchain.residues.append(newres) + else: + newres.atoms.append(newatom) + + self.atoms.append(newatom) + if newatom.chain.strip() != '': + newatom.chainobj = newchain + newatom.resobj = newres + + self.endlines = [] + + for t in self.transforms: + t[0] = array(t[0]); t[1] = array(t[1]) + + def renumAtoms(self,start=1): + """Renumber all atoms from 1 or another starting point""" + for i in range(len(self.atoms)): + self.atoms[i].num = start + i + + def atomByNum(self,num): + """Get the atom with the corresponding number""" + for a in self.atoms: + if a.num == num: + return a + return None + + def getCOM(self,countHet=0): + """Get the center of mass of all the atoms in the structure. If countHet is true, include heteroatoms as well""" + + if countHet: + alist = self.atoms + else: + alist = [a for a in self.atoms if a.type == 'ATOM'] + + com = [0,0,0] + for i in range(3): + com[i] = sum([a.coords[i] for a in alist])/float(len(alist)) + + return com + + def recenter(self): + """Move entire structure to shift COM to 0""" + com = self.getCOM(countHet=1) # center of mass of whole thing + # shift everything by center of mass + for a in self.atoms: + a.coords = a.coords - com + +def makeBareStruct(): + """Make a barebones structure with nothing in it, but containing appropriate start/end stuff so that it can be output to pdb""" + + struct = Structure() + #struct.startlines = ['HET SSN A 1 1402 Pseudo atom representation of DNA\n', \ + # 'HETNAM SSN Body and ribbon spatial coordinates\n',\ + # 'FORMUL 1 SSN C20 N20 P21\n'] + struct.startlines = ['HEADER structure\n'] + struct.endlines = ['END\n'] + + return struct diff --git a/BasicWLC/dssWLC/scripts/pdbutils.pyc b/BasicWLC/dssWLC/scripts/pdbutils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02d686b4089e005e520f31fed3b8e274e0ae1e79 GIT binary patch literal 15716 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 literal 0 HcmV?d00001 diff --git a/BasicWLC/dssWLC/scripts/snapshot2pdb.py b/BasicWLC/dssWLC/scripts/snapshot2pdb.py new file mode 100644 index 00000000..cad58cd0 --- /dev/null +++ b/BasicWLC/dssWLC/scripts/snapshot2pdb.py @@ -0,0 +1,165 @@ +#!/usr/bin/python + +# convert an output file of snapshots to a pdb with multiple structures + +from pdbutils import * +import sys, os + +def lines2Struct(lines,branchscl=0.1,scl=10): + """Parse lines containing info on chain bead position and orientation. Connect atoms appropriately. Return structure. All coordinates are scaled by scl.""" + + beads = []; uvec = []; obstacles=[] + chainnum = 0; newchain = 1; + + # use occupancies and b factors to track the weight of each bead + # based on integrated r and u + # given in the last 2 columns of the snapshot file + occupancies = [] + bfactors = [] + for line in lines: + data = line.split() + if data[0]=='C': # new chain + chainnum += 1 + newchain = 1 + continue + + coords = [float(x)*scl for x in data[1:7]] + + if (data[0] != 'A'): + print 'Bad line, skipping:', line + else: + + crd = coords[:3] + atm = Atom(coords=crd,name=data[0]) + if (len(data)>13): + tmp = [float(data[13]),float(data[14])] + if (tmp[0]>0): + atm.occupancy = -log(tmp[0]) + if (tmp[1]>0): + atm.bfactor = -log(tmp[1]) +# occupancies.append(float(data[13])) +# bfactors.append(float(data[14])) + + beads.append(atm) + beads[-1].chain = "%d"%chainnum + if (not newchain): + beads[-2].conect.append(beads[-1]) + beads[-1].conect.append(beads[-2]) + + # orientation vector atoms + ucrd = list(array(crd) + array(coords[3:])*branchscl) + uvec.append(Atom(coords=ucrd,name=data[0]+'U')) + uvec[-1].conect.append(beads[-1]) + beads[-1].conect.append(uvec[-1]) + + newchain = 0 + + #if len(occupancies)>0: + # occ = [x for x in occupancies if x>0] + # if (len(occ)>0): + # minocc= min(occ) + # for c in range(len(beads)): + # beads[c].occupancy = occupancies[c]/minocc + + # bfact = [x for x in bfactors if x>0] + # if (len(bfact)>0): + # minbfact= min(bfact) + # for c in range(len(beads)): + # beads[c].bfactor = bfactors[c]/minbfact + + struct = makeBareStruct() + struct.endlines=[] +# struct.startlines = ['HEADER struct\n'] + struct.startlines = [] + struct.atoms.extend(beads) + struct.atoms.extend(uvec) + struct.atoms.extend(obstacles) + struct.renumAtoms() + + return struct + +def runcode(argv): + if len(argv) < 2: + print """ +usage: beadobst2pdb.py infile(s) -o +All argument pairs besides the input file are optional. Can also supply a list or glob (eg: file.*.out) of input files. Input files may not start with "-" +-o Gives the output pdb file name. Default output file is: infileroot.pdb +-scl is the scaling factor to convert from .out to .pdb coordinates + (default 10, as the .out file is expected to be in nm while the .pdb file is in angstroms) +-branchscl is the factor for scaling branch lengths. Default is 0.1 +-skip # skip the first few snapshots +""" + sys.exit() + + # parse input arguments + infile = sys.argv[1] + + if '-o' in argv: + ind = argv.index('-o') + outfile = argv[ind+1] + else: + outfile = infile + (root,ext) = os.path.splitext(infile) + outfile = root+'.pdb' + + if '-branchscl' in argv: + ind = argv.index('-branchscl') + branchscl = float(argv[ind+1]) + else: + branchscl = 0.1 + + if '-scl' in argv: + ind = argv.index('-scl') + scl = float(argv[ind+1]) + else: + scl = 10 + + if '-skip' in argv: + ind = argv.index('-skip') + skip = int(argv[ind+1]) + print "Skipping first %d snapshots" %skip + else: + skip = 0 + + #read in file and get structures + structs = [] + IF = open(infile) + lines = IF.readlines() + infolines = [c for c in range(len(lines)) if lines[c][0]=='I'] + starting = 1; + for c in range(skip,len(infolines)): + data = lines[infolines[c]].split() + nbead = int(data[1]) + + start = infolines[c]+1 + if c==len(infolines)-1: + end = len(lines) + else: + end = infolines[c+1] + + beadlines = lines[start:end] +# if len(beadlines) != nbead: +# print 'Inappropriate number of beads. Skipping struct', c +# else: + + print 'Structure %d, with %d chains. %d total atoms.' %(c,nbead,len(beadlines)) + + struct = lines2Struct(beadlines,branchscl,scl) + append = not (starting) + starting = 0 + + struct.outputPDB(outfile,append,c+1) + #structs.append(st) + + IF.close() + + # for cf in range(len(infiles)): + # infile = infiles[cf]; outfile = outfiles[cf] + # print "Input file, output file:", infile, outfile + + # struct = coordFile2Struct(infile,branchscl,scl) + # struct.outputPDB(outfile) + +if __name__ == '__main__': + runcode(sys.argv) + diff --git a/BasicWLC/dssWLC/scripts/viewsnapshots.pml b/BasicWLC/dssWLC/scripts/viewsnapshots.pml new file mode 100644 index 00000000..1c4c5488 --- /dev/null +++ b/BasicWLC/dssWLC/scripts/viewsnapshots.pml @@ -0,0 +1,12 @@ +hide all +select beads, name A +spectrum count, rainbow, beads +alter beads, vdw=0.5 +show spheres, beads +show sticks, beads +set sphere_transparency=0.4, beads +set sphere_scale=0.1 +set stick_radius=0.01 + +select uvec, name AU +#show sticks, uvec \ No newline at end of file diff --git a/BasicWLC/dssWLC/shearableWLC.exe b/BasicWLC/dssWLC/shearableWLC.exe new file mode 100644 index 0000000000000000000000000000000000000000..fd7b2aa91625a25fe0feae05e3b9fdc79fd8427f GIT binary patch literal 329835 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