Newer
Older
package org.opensha.calc;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.opensha.util.TextUtils.NEWLINE;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import org.opensha.data.ArrayXY_Sequence;
import org.opensha.data.DataUtils;
import org.opensha.gmm.GroundMotionModel;
import org.opensha.gmm.Imt;
import com.google.common.base.Strings;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* Calculation configuration.
* @author Peter Powers
*/
public final class CalcConfig {
public final ExceedanceModel exceedanceModel;
public final double[] defaultImls;
public final Map<Imt, double[]> customImls;
private static final Gson GSON = new GsonBuilder()
.setPrettyPrinting()
.registerTypeAdapter(Site.class, new Site.Deserializer())
.registerTypeAdapter(Site.class, new Site.Serializer())
.registerTypeAdapter(SiteSet.class, new SiteSet.Deserializer())
.create();
/*
* Default values. These are initialized here because gson will not
* deserialize field initialized final primitives and Strings.
*/
// TODO consider adding TypeAdapter for enums that will throw an
// exception if invalid enum value is supplied in config.json
exceedanceModel = ExceedanceModel.TRUNCATION_UPPER_ONLY;
imts = EnumSet.of(Imt.PGA, Imt.SA0P2, Imt.SA1P0);
/* Slightly modified version of NSHM 5Hz curve, size = 20 */
defaultImls = new double[] { 0.0025, 0.0045, 0.0075, 0.0113, 0.0169, 0.0253, 0.0380, 0.0570, 0.0854, 0.128, 0.192, 0.288, 0.432, 0.649, 0.973, 1.46, 2.19, 3.28, 4.92, 7.38 };
customImls = Maps.newHashMap();
sites = new SiteSet(Lists.newArrayList(Site.builder().build()));
String customImlStr = "";
if (!customImls.isEmpty()) {
StringBuilder sb = new StringBuilder();
for (Entry<Imt, double[]> entry : customImls.entrySet()) {
String imtStr = "(IMT override) " + entry.getKey() + ": ";
sb.append(Strings.padStart(imtStr, 24, ' '))
.append(Arrays.toString(entry.getValue()))
StringBuilder sb = new StringBuilder("Calculation config:").append(NEWLINE)
.append(" Exceedance model: ")
.append("type=").append(exceedanceModel).append(", ")
.append("min=").append(deagg.rMin).append(", ")
.append("max=").append(deagg.rMax).append(", ")
.append("Δ=").append(deagg.Δr)
.append("min=").append(deagg.mMin).append(", ")
.append("max=").append(deagg.mMax).append(", ")
.append("Δ=").append(deagg.Δm)
.append("min=").append(deagg.εMin).append(", ")
.append("max=").append(deagg.εMax).append(", ")
.append("Δ=").append(deagg.Δε)
.append(NEWLINE);
sb.append(" ").append(site.toString()).append(NEWLINE);
return customImls.containsKey(imt) ? customImls.get(imt) : defaultImls;
}
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
* Returns models of the intensity measure levels for each {@code Imt} adressed
* by this calculation. Note that the x-values in each sequence are in natural
* log space.
*/
public Map<Imt, ArrayXY_Sequence> logModelCurves() {
Map<Imt, ArrayXY_Sequence> curveMap = Maps.newEnumMap(Imt.class);
for (Imt imt : imts) {
double[] imls = imlsForImt(imt);
imls = Arrays.copyOf(imls, imls.length);
DataUtils.ln(imls);
curveMap.put(imt, ArrayXY_Sequence.create(imls, null));
}
return curveMap;
}
public Map<Imt, ArrayXY_Sequence> modelCurves() {
Map<Imt, ArrayXY_Sequence> curveMap = Maps.newEnumMap(Imt.class);
for (Imt imt : imts) {
double[] imls = imlsForImt(imt);
imls = Arrays.copyOf(imls, imls.length);
curveMap.put(imt, ArrayXY_Sequence.create(imls, null));
}
return curveMap;
}
public static CalcConfig load(Path path) throws IOException {
Path configPath = path.resolve(FILE_NAME);
Reader reader = Files.newBufferedReader(configPath, UTF_8);
CalcConfig config = GSON.fromJson(reader, CalcConfig.class);
reader.close();
return config;
}
static void exportDefaults(Path path) throws IOException {
Writer writer = Files.newBufferedWriter(path, UTF_8);
GSON.toJson(new CalcConfig(), writer);
// TODO clean
public static void main(String[] args) throws IOException {
// Path path = Paths.get("..","nshmp-model-dev", "tmp", "config_calc3.json");
// exportDefaults(path);
// Path path = Paths.get("tmp", "config", "config_nshm_imls.json");
// Path path = Paths.get("..","nshmp-model-dev", "models", "PEER",
// "Set2-Case2a1", "config.json");
Path path = Paths.get("..", "nshmp-model-dev", "models", "PEER", "Set1-Case1",
"config.json");
CalcConfig c = load(path);
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
}
public static class Deagg {
public final double rMin;
public final double rMax;
public final double Δr;
public final double mMin;
public final double mMax;
public final double Δm;
public final double εMin;
public final double εMax;
public final double Δε;
Deagg() {
rMin = 0.0;
rMax = 100.0;
Δr = 10.0;
mMin = 5.0;
mMax = 7.0;
Δm = 0.1;
εMin = -3;
εMax = 3.0;
Δε = 0.5;
}