Skip to content

Commit

Permalink
Merge branch 'master' of github.com:grasingerm/polymer-stats
Browse files Browse the repository at this point in the history
  • Loading branch information
grasingerm committed Jun 5, 2023
2 parents f357caa + 3f263e9 commit 8fad8a0
Show file tree
Hide file tree
Showing 6 changed files with 234 additions and 1 deletion.
31 changes: 31 additions & 0 deletions inc/eap_chain.jl
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ function EAPChain(pargs::Dict)
InteractingEnergy();
elseif pargs["energy-type"] == "Ising"
IsingEnergy();
elseif pargs["energy-type"] == "cutoff"
UCutoff(pargs["cutoff-radius"]*pargs["mlen"])
else
error("energy-type is not understood.");
end,
Expand Down Expand Up @@ -144,6 +146,35 @@ function EAPChain(chain::EAPChain)
);
end

struct UCutoff <: Energy
cutoff_radius::Real;
end

# TODO: consider rewriting this to make better use of past calculations
# this is probably by far the slowest calculation *shrug emoji*
function (U_func::UCutoff)(chain::EAPChain)
crad2 = U_func.cutoff_radius * U_func.cutoff_radius;
U = 0.0;
@inbounds for i=1:n(chain)
@simd for j=i+1:n(chain) # once debugged, use inbounds
r = chain.xs[:, i] - chain.xs[:, j];
r2 = dot(r, r);
dU = if (r2 > crad2)
0.0
else
rmag = sqrt(r2);
= r / rmag;
r3 = r2*rmag;
μi = view(chain.μs, :, i);
μj = view(chain.μs, :, j);
(dot(μi, μj) - 3*dot(μi, r̂)*dot(μj, r̂)) / (4*π*r3);
end
U += dU;
end
end
return U;
end

# TODO: consider rewriting this to make better use of past calculations
# this is probably by far the slowest calculation *shrug emoji*
function U_interaction(chain::EAPChain)
Expand Down
6 changes: 5 additions & 1 deletion mcmc_clustering_eap_chain.jl
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,13 @@ s = ArgParseSettings();
default = 0.0
help = "zero energy bond angle"
"--energy-type", "-u"
help = "energy type (noninteracting|interacting|Ising)"
help = "energy type (interacting|cutoff|Ising|noninteracting)"
arg_type = String
default = "Ising"
"--cutoff-radius"
help = "cut off radius (units of monomer lengths)"
arg_type = Float64
default = 7.5
"--kT", "-k"
help = "dimensionless temperature"
arg_type = Float64
Expand Down
49 changes: 49 additions & 0 deletions run/phases-big_2023-05-18.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
println("Hello world!");

@everywhere using Printf;

@show workdir = if length(ARGS) > 0
ARGS[1];
else
".";
end

@everywhere fmt(x) = @sprintf("%07d", round(Int, 1e3*x));
@everywhere fmt_int(x) = @sprintf("%03d", x);

@everywhere function prefix(case)
"E0-$(fmt(case[:E0]))_K1-$(fmt(case[:K1]))_K2-$(fmt(case[:K2]))_kT-$(fmt(case[:kT]))_Fz-$(fmt(case[:Fz]))_Fx-$(fmt(case[:Fx]))_n-$(fmt(case[:n]))_b-$(fmt(case[:b]))_kappa-$(fmt(case[:kappa]))";
end

cases = Any[];
κs = [0.0];
Ks = zip([1.0; 0.0], [0.0; 1.0]);
E0s = vcat(0.05:0.05:1.0, 1.5:0.5:5.0, 10.0);
ns = Int[400];
bs = [0.5; 1.0];
kTs = [0.1; 1.0];
Fs = zip([0.0; 1.0; 0.0; 1.0/sqrt(2.0)], [0.0; 0.0; 1.0; 1.0/sqrt(2.0)]);
for b in bs, κ in κs, n in ns, Kvec in Ks, E0 in E0s, kT in kTs, F in Fs
K1, K2 = Kvec;
push!(cases, Dict(:E0 => E0, :K1 => K1, :K2 => K2,
:kT => kT, :Fz => F[2], :kappa => κ,
:Fx => F[1], :n => n, :b => b));
end

@info "total number of cases to run: $(length(cases))";

mkpath(workdir);

pmap(case -> begin;

outfile = joinpath(workdir, "$(prefix(case)).out");
if !isfile(outfile)
println("Running case: $case.");
command = `julia -O 3 mcmc_clustering_eap_chain.jl --chain-type dielectric --energy-type cutoff -b $(case[:b]) --bend-mod $(case[:kappa]) --E0 $(case[:E0]) --K1 $(case[:K1]) --K2 $(case[:K2]) --kT $(case[:kT]) --Fz $(case[:Fz]) --Fx $(case[:Fx]) -n $(case[:n]) --num-steps 2000000 --burn-in 200000 -v 2 --prefix $(joinpath(workdir, prefix(case)))`;
output = read(command, String);
write(outfile, output);
else
println("Case: $case has already been run.");
end

end, cases);
51 changes: 51 additions & 0 deletions run/phases-random_2023-05-15.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
println("Hello world!");

@everywhere using Printf;
@everywhere using Distributions;

@show workdir = if length(ARGS) > 0
ARGS[1];
else
".";
end

@everywhere fmt(x) = @sprintf("%07d", round(Int, 1e3*x));
@everywhere fmt_int(x) = @sprintf("%03d", x);

@everywhere function prefix(case)
"E0-$(fmt(case[:E0]))_K1-$(fmt(case[:K1]))_K2-$(fmt(case[:K2]))_kT-$(fmt(case[:kT]))_Fz-$(fmt(case[:Fz]))_Fx-$(fmt(case[:Fx]))_n-$(fmt(case[:n]))_b-$(fmt(case[:b]))_kappa-$(fmt(case[:kappa]))";
end

@everywhere Kdist = collect(zip([1.0; 0.0], [0.0; 1.0], [2.0; 1.0], [1.0; 2.0], [3.0; 2.0], [2.0; 3.0]));
@everywhere Edist = Normal(2.5, 1.0);
@everywhere ndist = Normal(35, 15);
@everywhere bdist = [1e-3; 1e-2; 1e-1; 0.5; 1.0; 2.0; 1e2];
@everywhere kTdist = [0.1; 1.0; 10.0]
@everywhere Fdist = Normal(2.0, 1.0);

mkpath(workdir);

@sync @distributed for i=1:1000000

case = Dict();
case[:kappa] = 0.0;
case[:E0] = max(0.05, rand(Edist));
Ks = rand(Kdist)
case[:K1], case[:K2] = Ks[1], Ks[2]
case[:n] = max(10, round(Int, rand(ndist)));
case[:b] = rand(bdist);
case[:kT] = rand(kTdist);
case[:Fx] = max(0.0, rand(Fdist));
case[:Fz] = max(0.0, rand(Fdist));

outfile = joinpath(workdir, "$(prefix(case)).out");
if !isfile(outfile)
println("Running case: $case.");
command = `julia -O 3 mcmc_clustering_eap_chain.jl --chain-type dielectric --energy-type interacting -b $(case[:b]) --bend-mod $(case[:kappa]) --E0 $(case[:E0]) --K1 $(case[:K1]) --K2 $(case[:K2]) --kT $(case[:kT]) --Fz $(case[:Fz]) --Fx $(case[:Fx]) -n $(case[:n]) --num-steps 2000000 --burn-in 200000 -v 2 --prefix $(joinpath(workdir, prefix(case)))`;
output = read(command, String);
write(outfile, output);
else
println("Case: $case has already been run.");
end

end
49 changes: 49 additions & 0 deletions run/phases_2023-05-15.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
println("Hello world!");

@everywhere using Printf;

@show workdir = if length(ARGS) > 0
ARGS[1];
else
".";
end

@everywhere fmt(x) = @sprintf("%07d", round(Int, 1e3*x));
@everywhere fmt_int(x) = @sprintf("%03d", x);

@everywhere function prefix(case)
"E0-$(fmt(case[:E0]))_K1-$(fmt(case[:K1]))_K2-$(fmt(case[:K2]))_kT-$(fmt(case[:kT]))_Fz-$(fmt(case[:Fz]))_Fx-$(fmt(case[:Fx]))_n-$(fmt(case[:n]))_b-$(fmt(case[:b]))_kappa-$(fmt(case[:kappa]))";
end

cases = Any[];
κs = [0.0];
Ks = zip([1.0; 0.0], [0.0; 1.0]; [2.0; 1.0]; [1.0; 2.0]);
E0s = vcat(0.05:0.05:1.0, 1.5:0.5:5.0, 10.0);
ns = Int[15; 25];
bs = [0.25; 0.5; 1.0];
kTs = [0.1; 1.0];
Fs = zip([0.0; 1.0; 0.0; 1.0/sqrt(2.0)], [0.0; 0.0; 1.0; 1.0/sqrt(2.0)]);
for b in bs, κ in κs, n in ns, Kvec in Ks, E0 in E0s, kT in kTs, F in Fs
K1, K2 = Kvec;
push!(cases, Dict(:E0 => E0, :K1 => K1, :K2 => K2,
:kT => kT, :Fz => F[2], :kappa => κ,
:Fx => F[1], :n => n, :b => b));
end

@info "total number of cases to run: $(length(cases))";

mkpath(workdir);

pmap(case -> begin;

outfile = joinpath(workdir, "$(prefix(case)).out");
if !isfile(outfile)
println("Running case: $case.");
command = `julia -O 3 mcmc_clustering_eap_chain.jl --chain-type dielectric --energy-type interacting -b $(case[:b]) --bend-mod $(case[:kappa]) --E0 $(case[:E0]) --K1 $(case[:K1]) --K2 $(case[:K2]) --kT $(case[:kT]) --Fz $(case[:Fz]) --Fx $(case[:Fx]) -n $(case[:n]) --num-steps 2000000 --burn-in 200000 -v 2 --prefix $(joinpath(workdir, prefix(case)))`;
output = read(command, String);
write(outfile, output);
else
println("Case: $case has already been run.");
end

end, cases);
49 changes: 49 additions & 0 deletions run/phases_2023-05-15b.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
println("Hello world!");

@everywhere using Printf;

@show workdir = if length(ARGS) > 0
ARGS[1];
else
".";
end

@everywhere fmt(x) = @sprintf("%07d", round(Int, 1e3*x));
@everywhere fmt_int(x) = @sprintf("%03d", x);

@everywhere function prefix(case)
"E0-$(fmt(case[:E0]))_K1-$(fmt(case[:K1]))_K2-$(fmt(case[:K2]))_kT-$(fmt(case[:kT]))_Fz-$(fmt(case[:Fz]))_Fx-$(fmt(case[:Fx]))_n-$(fmt(case[:n]))_b-$(fmt(case[:b]))_kappa-$(fmt(case[:kappa]))";
end

cases = Any[];
κs = [0.0];
Ks = zip([1.0; 0.0], [0.0; 1.0], [2.0; 1.0], [1.0; 2.0]);
E0s = vcat(0.05:0.05:1.0, 1.5:0.5:5.0, 10.0);
ns = Int[40; 50];
bs = [0.1; 0.25; 0.5; 1.0];
kTs = [0.1; 1.0];
Fs = zip([0.0; 1.0; 0.0; 1.0/sqrt(2.0)], [0.0; 0.0; 1.0; 1.0/sqrt(2.0)]);
for b in bs, κ in κs, n in ns, Kvec in Ks, E0 in E0s, kT in kTs, F in Fs
K1, K2 = Kvec;
push!(cases, Dict(:E0 => E0, :K1 => K1, :K2 => K2,
:kT => kT, :Fz => F[2], :kappa => κ,
:Fx => F[1], :n => n, :b => b));
end

@info "total number of cases to run: $(length(cases))";

mkpath(workdir);

pmap(case -> begin;

outfile = joinpath(workdir, "$(prefix(case)).out");
if !isfile(outfile)
println("Running case: $case.");
command = `julia -O 3 mcmc_clustering_eap_chain.jl --chain-type dielectric --energy-type interacting -b $(case[:b]) --bend-mod $(case[:kappa]) --E0 $(case[:E0]) --K1 $(case[:K1]) --K2 $(case[:K2]) --kT $(case[:kT]) --Fz $(case[:Fz]) --Fx $(case[:Fx]) -n $(case[:n]) --num-steps 2000000 --burn-in 200000 -v 2 --prefix $(joinpath(workdir, prefix(case)))`;
output = read(command, String);
write(outfile, output);
else
println("Case: $case has already been run.");
end

end, cases);

0 comments on commit 8fad8a0

Please sign in to comment.