-
Notifications
You must be signed in to change notification settings - Fork 2
/
magobject.h
289 lines (196 loc) · 8.84 KB
/
magobject.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
//
// @(#)magobject.h 1.1 misha-09may103
//
// Copyright (c) 2003 of Geometrics.
// All rights reserved.
//
// Created: 09may103 by misha@MISHA
// Version: 09may103 by misha@MISHA
//
#include <stdio.h>
#include <stdlib.h>
#ifndef MAGOBJECT_H
#define MAGOBJECT_H
#ifndef MIN
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#endif
#ifndef MAX
#define MAX(x, y) (((x) < (y)) ? (y) : (x))
#endif
#ifndef M_PI
# define M_PI 3.14159265358979324
#endif
#include "fieldtype.h"
#include <string>
#include <map>
#include <iostream>
#define OBJECT_TYPE_LEN 20
#define OBJECT_NAME_LEN 80
// different values in add_params fiels
// additonal offsets for observation point
#define X_OFFSET 0
#define Y_OFFSET 1
#define Z_OFFSET 2
// gradient direction for gradient computation
#define DIRECTION_X 3
#define DIRECTION_Y 4
#define DIRECTION_Z 5
// separation for total gradient computaion
#define FINITE_SEPARATION 6
#define MAX_FIELD_TYPES 4
#define MAX_FIELD_PARAMS 30
// Important note about Magnetic Moment (J) units:
//
// Package is using internal J scaling, which is 1.
//
// Distance units are **meters**
//
// For forward modeling:
// 1. If J is in A*m^2, multiply J by 100 before calling
// the program (or multiply result by 100).
// 2. If J is in cgs, divide it by 10 before calling the program
//
// For inversion:
// 1. To obtain J in A*m^2, divide results by 100
// 2. To obtain J in cgs, multiply by 10
//
// To get approx. mass in kg, divide by 5*10e-2
//
#include <string>
class CMagObject;
typedef int (CMagObject::*GetDerivativesFunc)(FIELDTYPE type, double *add_params, double *, int, double *, double,
double, double, double, double, double, double, double, double,
int, int *, int *);
typedef double (CMagObject::*GetFieldFunc)(FIELDTYPE type, double * add_params,
double x_obs, double y_obs, double z_obs,
double x0, double y0, double z0,
double A, double B, double C,
int data_pos);
class CMagObject {
protected:
int m_bIsValid; // if object is valid
// 0 - no both Lin/nonlin 1 - lin only 2 -both
int m_bInduced; // magnetization type
int m_nLinearParams; // total number of linear (J) parameters
int m_nNonLinearParams; // total number of non-linear (geometrics) parameters
double * m_lfJ; // linear parameters (magnetization)
double * m_lfPos; // non-linear parameters (positions)
double * m_lfStdDevJ; // standard deviation for linear parameters estimation
double * m_lfStdDevPos; // standard deviation for non-linear parameters estimation
double * m_lfJUp; // upper limits for J;
double * m_lfPosUp; // upper limits for positions;
double * m_lfJLow; // upper limits for J;
double * m_lfPosLow; // upper limits for positions;
double * m_lfJMax; // max. possible value for J;
double * m_lfPosMax; // max. possible value for position;
double * m_lfJMin; // min. possible value for J;
double * m_lfPosMin; // min. possible value for position;
char m_sObjectType[OBJECT_TYPE_LEN]; // type and name of the object
char m_sObjectName[OBJECT_NAME_LEN];
int * m_pJfixed; // holds 0 for variable value and 1 for fixed - linear variables
int * m_pPosfixed; // holds 0 for variable value and 1 for fixed - non-linear variables
int m_iLinearStart; // where linear or non-linear parts start in common matrix.
int m_iNonLinearStart; // these are valid ONLY right after calling CMagCollection::GetCurrentMagObject
int m_nLinearParamsReport;
int m_nNonLinearParamsReport;
int m_iObjectLinearAbilities; // 0 - can do nothing
int m_iObjectNonLinearAbilities; // 1 - can compute field
// 2 - can compute second derivatives
FIELDTYPE m_iFieldType; // field type to compute only for this object;
// if "anyfield" than compute for all fields possible
int m_iRefCounter; // reference counter; tremove object only when it is 0
std::string m_sID;
// protected methods
virtual void destroy();
virtual void copy(CMagObject const &o);
public:
CMagObject();
CMagObject(int is_induced, int n_linear, int n_nonlinear, char *type=NULL, char *name=NULL);
virtual ~CMagObject() { destroy(); }
CMagObject (CMagObject const &o); // copy constructor;
CMagObject const &operator=(CMagObject const &o); // overloaded assignment
int IsValid() { return m_bIsValid==2; }
FIELDTYPE GetFieldType() { return m_iFieldType; }
void SetFieldType(FIELDTYPE field) { m_iFieldType = field; }
void GetFieldTypeText(std::string & str);
virtual void SetInduced(int is_induced) { m_bInduced = is_induced; }
virtual int GetTotalLinearParams() { return m_nLinearParamsReport; }
virtual int GetTotalNonLinearParams() { return m_nNonLinearParamsReport;}
virtual int GetAllLinearParams() { return m_nLinearParams; }
virtual int GetAllNonLinearParams() { return m_nNonLinearParams;}
// params - input / output array
// size - size of "params"
// type: 0 for values, 1 for standard errors
virtual int GetLinearParams(double * params, int size, int type = 0);
virtual int GetNonLinearParams(double * params, int size, int type = 0);
virtual int GetAllPositionParams(double * params, int size);
virtual int SetLinearParams(double * params, int size, int type = 0);
virtual int SetNonLinearParams(double * params, int size, int type = 0);
double GetNonLinearParam(int n_param, int type = 0);
double GetLinearParam(int n_param, int type = 0);
// x_obs, y_obs, z_obs - position of the observation point
// x0, y0, z0 - position of the origin
// A, B, C - Earth's magnetic field direction coefficients
virtual double ComputeField(FIELDTYPE type, double * add_params, double x_obs, double y_obs, double z_obs,
double x0, double y0, double z0,
double A, double B, double C,
int data_pos) {return 0.; }
virtual int GetLinearDerivatives(FIELDTYPE type, double * add_params, double * deriv, int size,
double * pos_deriv,
double x_obs, double y_obs, double z_obs,
double x0, double y0, double z0,
double A, double B, double C,
int data_pos,
int * n_params, int * start = NULL) { *n_params = 0; return 0;}
virtual int GetNonLinearDerivatives(FIELDTYPE type, double * add_params, double * deriv, int size,
double * pos_deriv,
double x_obs, double y_obs, double z_obs,
double x0, double y0, double z0,
double A, double B, double C,
int data_pos,
int * n_params, int * start = NULL) { *n_params = 0; return 0;}
void SetLinNonLinStarts(int lin_start, int nonlin_start) {
m_iLinearStart = lin_start;
m_iNonLinearStart = nonlin_start;
}
void SetID(std::string id) { m_sID = id; };
const char * GetID() { return (m_sID.empty() ? NULL : m_sID.c_str()); }
void UpdateReportedParams();
// service: get / save name and type
virtual int SetObjectType(char * type);
virtual int SetObjectName(char * type);
virtual int GetObjectType(char * type, int size);
virtual int GetObjectName(char * type, int size);
virtual void DumpParameters(FILE * dat);
// 0 - can do nothing
// 1 - can compute field
// 2 - can compute derivatives
int GetObjectLinearAbilities() { return m_iObjectLinearAbilities; }
int GetObjectNonLinearAbilities() { return m_iObjectNonLinearAbilities; }
virtual void SetObjectLinearAbilities( int ab) { m_iObjectLinearAbilities = ab; }
virtual void SetObjectNonLinearAbilities(int ab) { m_iObjectNonLinearAbilities = ab; }
virtual int FixLinearParam(int n_param, int is_fixed = 0, double val = 0.);
virtual int FixNonLinearParam(int n_param, int is_fixed = 0, double val= 0.);
virtual int FixLinearParamInterval(int n_param, double up=1.e+38, double low=-1.e+38);
virtual int FixNonLinearParamInterval(int n_param, double up=1.e+38, double low=-1.e+38);
virtual int IsLinearParamFixed(int n_param);
virtual int IsNonLinearParamFixed(int n_param);
// for correction object
virtual int CanComputeField() { return 0; }
// for error forward estimation
virtual void InitMinMaxParams();
virtual void UpdateMinMaxParams();
virtual void DumpMinMaxParams(FILE * out);
// reference counter
void IncrementRefCounter() { m_iRefCounter++; }
void DecrementRefCounter() { m_iRefCounter--; }
int GetRefCounter() { return m_iRefCounter; }
// get header information
virtual int GetInfoHeader(char * str, int size) { return 0; }
virtual int GetDataHeader(char * str, int size) { return 0; }
virtual void DumpToStream(std::ostream & str, std::string comment="#",
char * close_str="/", char * delimit=",",
std::string offset = " ") {};
virtual void DumpToXMLStream(std::ostream & str) {};
};
#endif