#!../cryoblocks
# Define initial temperature of our system:
define T0 20mK
# Describe copper block with mass 100g
# in a contact with 1 mole of liquid He3 at 0 bar:
block Cu ${T0} type=paramagnet material=copper mass=100g
block He ${T0} type=liquid_he3 volume=36cm^3 P=0bar
# They are linked by Kapitza thermal resistance which
# is proportional to contact surface area. Let's use
# area 1m^2 (it's not that big for sintered-powder heat exchangers)
link k1 Cu He type=kap_res_he3 area=1m^2
# We will cool the system by mixing chamber (MC) of a simple dilution
# fridge with cooling power proportional to T^2, circulation 50 umol/s
# and external heat leak 0.2uW.
block MC ${T0} type=simple C=0.2J/K # use some reasonable heat capacity
block bath 300K type=bath # this is needed as a sink for heat leaks
link MC_cooling MC bath type=dilution_cooling ndot=50umol/s
link MC_heatleak bath MC type=const Qdot=0.2uW
# The copper block is connected to the mixing chamber with a heat switch
# with electrical resistance 10 uOhm:
link precool MC Cu type=metal_bar R=10uOhm
# Magnetic field is 8T
field 8T
# We will be calculating with some large steps (30min). To keep the accuracy
# intermediate steps will be always done by the program. We can show/hide them
# by setting print_substeps to 1/0
print_substeps 0
# Now define what do we want to print: time, magnetic field,
# temperatures of a few blocks and heat flow through a link
print t B T(MC) T(Cu) T(He) Q(precool)
# Where we print result (use '-' for stdout):
print_to_file doc_example.dat
# Precool for 72h.
run 72h 30m
####
# Now we precooled to about 9mK. Let's disconnect HS and
# demagnetize to 0.4T (20 times) during 10h:
link precool MC Cu type=metal_bar R=1MOhm
field_rate -0.76T/h
run 10h 30m
# And now just wait
field_rate 0T/h
run 18h 30m
The system is defined as a set of blocks
and links
with certain
properties. Program reads a command file with the following structure:
-
Comments start with
#
. -
Empty lines are skipped.
-
block <name> <temperature> [parameters]
-- Define a block with a given name and starting temperature. -
link <name> <block1> <block2> [parameters]
-- Define a named link which connects block1 and block2. -
delete (block|link) <name>
-- Delete block or link. -
run <time> [step=<time step>] [abs=<0|1>] [to_field=<value>]
-- Do calculations for a given time period, print results. Ifstep
step parameter is missing then a single step is used (internally it will be divided by substeps to keep accuracy, substep results can be printed by settingprint_substeps 1
). Ifabs
parameter is missing or 0 then<time>
is a calculation period length. otherwise it's final time at the end of the calculation (including shift set bytime_shift
command). Ifto_field
parameter is used, then field rate is set to reach the specified field at the end of the calculation. After calculation field rate is reset to a previous value. -
run_to <final time> [<time step>]
-- DO NOT USE. Equivalent torun <final time> abs=1
. -
include <file name>
-- Read commands from a file. -
exit
-- Stop processing file and exit. -
define <name> <value>
-- Define a parameter which can be used later.${<name>}
will be substituted by<value>
. -
field <value>
-- Set magnetic field. -
field_rate <value>
-- Set magnetic field rate. -
time_shift <value>
-- When printing result add the value to time. -
max_tempstep <value>
-- Use smaller calculation steps to keep relative change of temperatures on each step less than given value. (Default: 1e-2). -
max_tempacc <value>
-- Use smaller calculation steps to keep relative temperature accuracy (difference between single dt and double dt/2 steps) less than given value. (Default: 1e-6). -
print <par1> ...
-- Set list of parameters for output duringrun
command. UseT(<name>)
for block temperature,C(name)
for block heat capacity,Q(name)
for heat flow through a link,t
for time,B
for magnetic field. Example:print t H T(block1) T(block2) Q(link1)
. -
print_to_file <name>
-- Set filename for printing data. If name is-
then usestdout
(default). -
print_substeps 0|1
-- Print values for requested time steps or for actual calculation steps (they could be smaller to achieve reasonable accuracy). -
read_data <file name> <par1> ...
-- Read time grid and additional parameters and do calculation. Parameters determine data columns:T(<name>)
for a block temperature,B
for magnetic field,-
for skipping a column (numeric or non-numeric). If<file name>
is-
then data is read from the current command file. Reading stops onEOF
line or end of file. -
read_factors <time factor> <par1 factor> ...
-- Set factors to multiply values inread_data
command. First value is factor for the time column. Columns defined as-
should be skipped here. Example: to read time in hours and temperature of blockMC
in mK from 1st and 3rd columns of a file use commands:
read_factors 3600 1e-3
read_data file.dat - T(MC)
Consider a block with temperature T
with external heating power dQ
.
Entropy of the block S
depends on temperature and maybe other
parameters (magnetic field B
).
Then dQ = T dS = C dT + D dB
, where C = T \partial S / \partial T
is
heat capacity, and D = T \partial S / \partial B
- cooling power of
demagnetization process. Using this
formula each block object can calculate change of temperature dT
as a
function of dQ
, T
, B
, and dB
.
A thermal link object can calculate heat transfer depending on temperatures of two blocks connected by the link.
Calculation is done using adaptive time steps. On each step initial temperatures of all blocks are known. For each link heat flows are calculated, Total power applied to each block is found. Using these values new temperatures of each block are found. Blocks with zero heat capacity are calculated differently: before and after each step a zero of total heat flow on every such block is found as a function of temperatures of these blocks.
All parameters usually have some dimensions, it should be specified. For example,
time in run
command can be written as 1s
, 0.1m
, 1e-2ms
, etc.
Following types of blocks are supported:
-
block <name> <temperature> type=bath
-- A heat bath with infinite heat capacity and constant temperature. -
block <name> <temperature> type=zero-c
-- A block with zero heat capacity. -
block <name> <temperature> type=simple C=<value> power=<p> factor=<f>
-- One can useC
parameter to specify constant heat capacity in units which can be converted toJ/K
. Alternatively one can givepower
andfactor
dimensionless values, to haveC=<factor>*T^<power> [J/K]
. Zero heat capacity is allowed. -
block <name> <temperature> type=paramagnet [parameters]
-- paramagnetic material (e.g. copper nuclei). Parameters:material=<v>
-- Set parametersBint
,gyro
,spin
for a certain material:copper
(nuclei),he3
(solid).Bint=<v>
-- Internal field (overrides value set bymaterial
parameter), default 0.gyro=<v>
-- Gyromagnetic ratio (overrides value set bymaterial
parameter).spin=<v>
-- Spin (overrides value set bymaterial
parameter).moles=<v>
-- Number of moles.mass=<v>
-- If material is set then mass can be used instead of moles.Bfactor
-- Factor for external magnetic field, default: 1.0
-
block <name> <temperature> type=curie-weiss [parameters]
-- Curie-Weiss magnet with spin 1/2. Parameters:Tc=<v>
-- Critical temperature.gyro=<v>
-- Gyromagnetic ratio.moles=<v>
-- Number of moles.Bfactor
-- Factor for external magnetic field, default: 1.0
-
block <name> <temperature> type=liquid_he3 [parameters]
-- liquid He3 (uses he3lib). Parameters:P=<v>
-- Pressuremoles=<v>
-- Number of molesmass=<v>
-- Can be used instead of moles.volume=<v>
-- Can be used instead of moles (pressure-dependent molar volume is used).
-
block <name> <temperature> type=compound : [parameters1] + [parameters2] + ...
-- Compound block. A combination of a few different blocks built using[parameters1]
,[parameters2]
, ...
Following types of links are supported:
-
link <name> <block1> <block2> type=const Qdot=<value>
-- A constant heat transfer. Not a physical process, but good for tests. -
link <name> <block1> <block2> type=simple K=<v> power=<p> factor=<f>
-- One can useK
parameter to specify constant heat conductivity in units which can be converted toW/K
. Alternatively one can givepower
andfactor
dimensionless values, to haveK=<factor>*T^<power> [W/K]
. Heat transfer is calculated asQdot = <factor>*(T1^P - T2^P)/P
, whereP=<power>+1
. -
link <name> <block1> <block2> type=metal_bar R=<v>
-- A bar made of metal. Total resistance R, Wiedemann-Franz low is used to calculate heat conductivity. -
link <name> <block1> <block2> type=field_heat_leak B0=<v> B1=<v> B2=<v> dB2=<v>
-- A field-dependent heat leak,Qdot = <B0> + <B1>*B + <B2>*B^2 + <dB2>*(dB/dt)^2
. By default all parameters are 0. -
link <name> <block1> <block2> type=simple_bar [parameters]
-- A bar made of some material with Ka*T^Kb heat conductivity [W/m/K]. Length L, cross-section area S. Parameters:material=<v>
-- torlon4203, GRP, nylon, G10-CR, macor, stycast1266, stycast2850ft, araldite_ct200, CuNi, Manganin.Ka=<v>
-- Ka, overrides value set bymaterial
parameterKb=<v>
-- Kb, overrides value set bymaterial
parameterS=<v>
-- cross-section area of the barL=<v>
-- bar length
-
link <name> <block1> <block2> type=korringa [parameters]
-- Spin-lattice coupling (heat flow between nuclear spin system and electrons, Korringa low). Parameters:material=<v>
-- predefined values for. Variants: copperBint=<v>
-- internal field (overrides value set bymaterial
parameter), default 0gyro=<v>
-- gyromagnetic ratio (overrides value set bymaterial
parameter)spin=<v>
-- spin (overrides value set bymaterial
parameter)kappa=<v>
-- high-field value of Korringa constant (overrides value set bymaterial
parameter)alpha=<v>
-- parameter alpha in field dependence of Korringa constant (overrides value set bymaterial
parameter), default 1moles=<v>
-- number of molesmass=<v>
-- if material is set then mass can be used instead of moles
-
link <name> <block1> <block2> type=el-ph [parameters]
-- Electron-phonon coupling (Qdot = C*(T1^5-T2^5)*nmoles
, see Pobell book f.10.9). Parameters:material=<v>
-- predefined values for. Variants:copper
C=<v>
-- set parameter C (overrides value set bymaterial
parameter), default 0moles=<v>
-- number of molesmass=<v>
-- if material is set then mass can be used instead of moles
-
link <name> <block1> <block2> type=kap_res_he3 area=<S> power=<N> C=<v>
-- Kapitza resistance between He3 and solids.R = 900/T/S [W]
, orR=41.0/T^2/S
, orR = 0.1/T^3/S
for temperatureT
and areaS
. Power should be 1, 2, or 3. ParameterC
is used to override numerical factor. -
link <name> <block1> <block2> type=dilution_cooling ndot=<V>
Cooling power of a dilution refrigerator. block1 should be mixing chamber, block2 - thermal bath at any temperature. -
link <name> <block1> <block2> type=dilution_circ ndot=<V> phase=<C|D>
Heat transfer by circulation in a dilution refrigerator. Phase parameter is "C" or "D". T2 is not used in the calculation.
A python script cryoblocks_fit
is available for fitting data to a cryoblocks
model.
Usage: cryoblocks_fit <command file>
All additional information is stored in the cryoblocks
command file, in comments started with
FIT
word:
define <name> <value> #FIT <MIN>:<MAX>
-- use variable as fit parameter#FIT_COLS <N1>:<N2>
-- which colums of cryoblocks output should be used#FIT_FILE <NAME> <N1>:<N2>
-- name of data file and data columns in it#FIT_RANGE <V1>:<V2>
-- crop data to the range#FIT_SCALES <V1>:<V2>
-- factors to multiply data columns in the file#FIT_PLOT <NAME>
-- PNG file for plotting fit result (if needed)#FIT_SKIP (0|1)
-- skip fitting, run cryoblocks with initial values