func EnvSplitTcB(baseEnv *tempAll.Environment, TcFactors, BeFields []float64, epsAbs, epsRel float64) ([]*tempAll.Environment, error) { TcEnv := baseEnv.Copy() TcEnv.Be_field = 0.0 TcEnv.Mu_b = 0.0 _, err := tempCrit.CritTempSolve(TcEnv, epsAbs, epsRel) if err != nil { return nil, err } Tc := 1.0 / TcEnv.Beta omegaFit, err := tempCrit.OmegaFit(TcEnv, tempCrit.OmegaPlus) if err != nil { return nil, err } TcEnv.A, TcEnv.B = omegaFit[0], omegaFit[2] TcEnv.PairCoeffsReady = true result := []*tempAll.Environment{} for _, TcFactor := range TcFactors { env := TcEnv.Copy() T := TcFactor * Tc env.Beta = 1.0 / T env.Temp = T // fix (D1, Mu_h) appropriate for Beta //_, err := SolveD1Mu_h(env, epsAbs, epsRel) _, err := SolveD1Mu_hMu_b(env, epsAbs, epsRel) if err != nil { return nil, err } // keep (D1, Mu_h) independent of magnetic field BeNum := len(BeFields) thisEnv_BeSplit := env.MultiSplit([]string{"Be_field"}, []int{BeNum}, []float64{BeFields[0]}, []float64{BeFields[BeNum-1]}) result = append(result, thisEnv_BeSplit...) } return result, nil }
// Solve the (D1, Mu_h, Beta) system with x and F0 fixed. func D1MuBetaSolve(env *tempAll.Environment, epsAbs, epsRel float64) (vec.Vector, error) { // our guess for beta should be above beta_c if env.A == 0.0 && env.B == 0.0 { D1, Mu_h, F0 := env.D1, env.Mu_h, env.F0 env.F0 = 0.0 // F0 is 0 at T_c _, err := tempCrit.CritTempSolve(env, epsAbs, epsRel) if err != nil { return nil, err } fmt.Printf("%v; Tc = %f\n", env, 1.0/env.Beta) omegaFit, err := tempCrit.OmegaFit(env, tempCrit.OmegaPlus) if err != nil { return nil, err } env.A, env.B = omegaFit[0], omegaFit[2] env.PairCoeffsReady = true env.Beta += 0.1 // we are at T < T_c; uncache env env.D1, env.Mu_h, env.F0 = D1, Mu_h, F0 } //fmt.Printf("%v; Tc = %f\n", env, 1.0 / env.Beta) // solve low temp system for reasonable values of D1 and Mu_h first _, err := D1MuSolve(env, epsAbs, epsRel) if err != nil { return nil, err } // solve the full low temp system system, start := D1MuBetaSystem(env) solution, err := solve.MultiDim(system, start, epsAbs, epsRel) if err != nil { return nil, err } return solution, nil }
// Solve the (D1, Mu_h, F0) system with x and Beta fixed. func D1MuF0Solve(env *tempAll.Environment, epsAbs, epsRel float64) (vec.Vector, error) { if env.A == 0.0 && env.B == 0.0 { // We must have T < T_c < T_p (Beta > Beta_c > Beta_p). // Getting Beta_p is fast, so do that first. D1, Mu_h, F0, Beta := env.F0, env.Mu_h, env.F0, env.Beta // cache env env.F0 = 0.0 // F0 is 0 at T_c and T_p _, err := tempPair.PairTempSolve(env, epsAbs, epsRel) if err != nil { return nil, err } if Beta < env.Beta { return nil, fmt.Errorf("Beta = %f less than Beta_p in env %s", Beta, env.String()) } _, err = tempCrit.CritTempSolve(env, epsAbs, epsRel) if err != nil { return nil, err } if Beta < env.Beta { return nil, fmt.Errorf("Beta = %f less than Beta_c in env %s", Beta, env.String()) } fmt.Printf("%v; Tc = %f\n", env, 1.0/env.Beta) omegaFit, err := tempCrit.OmegaFit(env, tempCrit.OmegaPlus) if err != nil { return nil, err } env.A, env.B = omegaFit[0], omegaFit[2] env.PairCoeffsReady = true // we are at T < T_c; uncache env env.D1, env.Mu_h, env.F0, env.Beta = D1, Mu_h, F0, Beta } // solve low temp system for reasonable values of D1 and Mu_h first _, err := D1MuSolve(env, epsAbs, epsRel) if err != nil { return nil, err } // solve the full low temp system system, start := D1MuF0System(env) solution, err := solve.MultiDim(system, start, epsAbs, epsRel) if err != nil { return nil, err } return solution, nil }
// Solve the (D1, Mu_h, Beta) system with x and Mu_b fixed. func FlucTempSolve(env *tempAll.Environment, epsAbs, epsRel float64) (vec.Vector, error) { // fix pair coefficients if env.A == 0.0 && env.B == 0.0 && env.FixedPairCoeffs { D1, Mu_h, Mu_b, Beta := env.D1, env.Mu_h, env.Mu_b, env.Beta env.Mu_b = 0.0 // Mu_b is 0 at T_c _, err := tempCrit.CritTempSolve(env, epsAbs, epsRel) if err != nil { return nil, err } omegaFit, err := tempCrit.OmegaFit(env, tempCrit.OmegaPlus) if err != nil { return nil, err } env.A, env.B = omegaFit[0], omegaFit[2] env.PairCoeffsReady = true // uncache env env.D1, env.Mu_h, env.Mu_b, env.Beta = D1, Mu_h, Mu_b, Beta } // our guess for beta should be a bit above Beta_p pairSystem, pairStart := tempPair.PairTempSystem(env) _, err := solve.MultiDim(pairSystem, pairStart, epsAbs, epsRel) if err != nil { return nil, err } env.Beta += 0.1 // solve fluc temp system for reasonable values of Mu_h and D1 first system, start := FlucTempD1MuSystem(env) _, err = solve.MultiDim(system, start, epsAbs, epsRel) if err != nil { return nil, err } // solve the full fluc temp system system, start = FlucTempFullSystem(env) solution, err := solve.MultiDim(system, start, epsAbs, epsRel) if err != nil { return nil, err } return solution, nil }