31 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
35 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
40 Ainf = Eigen::Matrix< double, 6, 6 >::Zero( );
42 for(
int i=0; i <6; i++)
43 for(
int j=0; j <6; j++)
45 A[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
46 B[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
47 C[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
48 D[i][j] = Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic >::Zero( 1, 1 );;
53 Eigen::Matrix<double, 6, 6> Ainf;
58 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> A[6][6];
59 Eigen::Matrix<double, Eigen::Dynamic, 1 > B[6][6];
60 Eigen::Matrix<double, 1 , Eigen::Dynamic> C[6][6];
61 Eigen::Matrix<double, Eigen::Dynamic, 1 > D[6][6];
72 virtual void Read(
const std::string &fname,
int flipPhaseForOSC =0) = 0;
73 virtual Eigen::Matrix<double,6,6> GetHToO() = 0;
76 const std::vector<std::string>&
Warnings()
const {
return m_warnings; }
77 void ClearWarnings() { m_warnings.clear(); }
79 virtual void SetOriginWorigin() = 0;
80 virtual void SetOriginGorigin() = 0;
81 virtual void SetOrigin( Eigen::Matrix<double,3,1> &r ) = 0;
83 Eigen::Matrix<double,6,6> GetMassRigidBody()
85 return GetHToO().transpose()*Mrbeig*GetHToO();
88 Eigen::Matrix<double,6,6> GetAinf(
unsigned int speedno=0)
90 return RadiationApproximation[speedno].Ainf;
93 Eigen::Matrix<double,6,6> GetMassTotal(
unsigned int speedno=0)
95 return RadiationApproximation[speedno].Ainf+GetHToO().transpose()*Mrbeig*GetHToO();
98 Eigen::Matrix<double,6,6> GetAw(
unsigned int FreqNo,
unsigned int SpeedNo=0)
100 return GetHToO().transpose()*A[SpeedNo][FreqNo]*GetHToO();
103 Eigen::Matrix<double,6,6> GetBw(
unsigned int FreqNo,
unsigned int SpeedNo=0)
105 return GetHToO().transpose()*B[SpeedNo][FreqNo]*GetHToO();
108 virtual Eigen::Matrix<double,6,6> GetCw(
unsigned int FreqNo,
unsigned int SpeedNo=0)
110 return GetHToO().transpose()*C[SpeedNo][FreqNo]*GetHToO();
113 Eigen::Matrix<double,1,Eigen::Dynamic> GetAij(
unsigned int DOF1,
unsigned int DOF2,
unsigned int SpeedNo=0)
115 Eigen::Matrix<double,1,Eigen::Dynamic> A = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
117 for(
unsigned int i=0; i < NoFrequency; i++)
119 Eigen::Matrix<double,6,6> Aw = GetAw(i,SpeedNo);
120 A(i) = Aw(DOF1,DOF2);
125 Eigen::Matrix<double,1,Eigen::Dynamic> GetBij(
unsigned int DOF1,
unsigned int DOF2,
unsigned int SpeedNo=0)
127 Eigen::Matrix<double,1,Eigen::Dynamic> B = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
129 for(
unsigned int i=0; i < NoFrequency; i++)
131 Eigen::Matrix<double,6,6> Bw = GetBw(i,SpeedNo);
132 B(i) = Bw(DOF1,DOF2);
137 Eigen::Matrix<double,1,Eigen::Dynamic> GetCij(
unsigned int DOF1,
unsigned int DOF2,
unsigned int SpeedNo=0)
139 Eigen::Matrix<double,1,Eigen::Dynamic> C = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
141 for(
unsigned int i=0; i < NoFrequency; i++)
143 Eigen::Matrix<double,6,6> Cw = GetCw(i,SpeedNo);
144 C(i) = Cw(DOF1,DOF2);
149 Eigen::Matrix<double,1,Eigen::Dynamic> GetSpeed()
151 Eigen::Matrix<double,1,Eigen::Dynamic> speed = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoSpeed);
152 for(
unsigned int i=0; i < NoSpeed; i++ ) speed(i) = Speed[i];
156 Eigen::Matrix<double,1,Eigen::Dynamic> GetHeading()
158 Eigen::Matrix<double,1,Eigen::Dynamic> head = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoHeading);
159 for(
unsigned int i=0; i < NoHeading; i++ ) head(i) = Heading[i];
163 Eigen::Matrix<double,1,Eigen::Dynamic> GetFrequency(
int SpeedNo=0)
165 Eigen::Matrix<double,1,Eigen::Dynamic> freq = Eigen::Matrix<double,1,Eigen::Dynamic>::Zero(1,NoFrequency);
166 for(
unsigned int i=0; i < NoFrequency; i++ ) freq(i) = Frequency[SpeedNo][i];
170 virtual Eigen::Matrix<double,3,1> GetRg()
175 virtual Eigen::Matrix<double,3,1> GetRo()
180 Eigen::Matrix<double,6,1> GetFirstOrderForce(
const Eigen::Matrix<double,3,1> &Kxy,
double ShipSpeed,
181 double WaveDirection,
double WaveAmplitude,
double WaveFrequency,
double WaveNumber,
double WavePhase,
186 double EncounterFrequency = WaveFrequency-WaveNumber*ShipSpeed;
187 double Direction = EncounterFrequency/std::abs(EncounterFrequency);
188 EncounterFrequency = std::abs(EncounterFrequency);
192 for(
int DOF=0; DOF < 6; DOF++)
195 std::complex<double> RAO = FroudeFrylov->GetRAOValue(DOF,WaveDirection,std::abs(ShipSpeed),WaveFrequency);
198 double Amplitude = std::abs(RAO);
199 double Phase = atan2( RAO.imag(), RAO.real() );
203 double ThisWaveHeight = WaveAmplitude*sin(EncounterFrequency *Time -Kxy(0) -Kxy(1) + Phase - WavePhase );
204 Fptr[DOF] = Direction*Amplitude*ThisWaveHeight;
207 Eigen::Map<Eigen::Matrix<double,6,1>,Eigen::Unaligned> tmp(Fptr);
208 return GetHToO().transpose()*tmp;
211 Eigen::Matrix<double,6,1> GetSecondOrderForce(Eigen::Matrix<double,3,1> ShipPosition,
double ShipSpeed,
212 double WaveDirection,
double WaveHeight,
double WaveFrequency,
double WaveNumber,
double WavePhase,
216 for(
int DOF=0; DOF < 6; DOF++)
220 std::complex<double> Amplitude = WaveDrift->GetRAOValue(DOF,ShipSpeed,WaveFrequency,WaveDirection);
221 Fptr[DOF] = std::pow(WaveHeight,2)*Amplitude.real();
224 Eigen::Map<Eigen::Matrix<double,6,1>,Eigen::Unaligned> tmp(Fptr);
225 return GetHToO().transpose()*tmp;
228 void GenerateZeroSpeedTimeDomainApproximation()
231 if( !RadiationApproximation.empty() ) RadiationApproximation.clear();
232 if( ZeroSpeedIdentificationFromCache() ){
239 FreqDomainIdent Identification;
240 Identification.SetPotentialData(
this);
241 Identification.IdentificationMethod(FreqDomainIdent::VECTOR_FITTING);
243 TimeDomainRadiation zeroSpeedSystem;
246 for(
int i=0; i < 6; i++)
249 for(
int j=0; j <= i; j++)
251 if( (i == 1 || i == 3 || i == 5) && (j==0 || j==2 || j==4) )
continue;
252 if( (j == 1 || j == 3 || j == 5) && (i==0 || i==2 || i==4) )
continue;
254 std::cout <<
"Identifying (i/j) = (" << i <<
"/" << j <<
") ";
256 if( is2Ddata() && (i!=0 && j!=0)){
257 FreqDomainIdent::StateSpace SS = Identification.IdentifySS(i,j);
258 zeroSpeedSystem.Ainf(i,j) = Identification.GetAinf(i,j);
259 zeroSpeedSystem.A[i][j] = SS.A;
260 zeroSpeedSystem.B[i][j] = SS.B;
261 zeroSpeedSystem.C[i][j] = SS.C;
262 zeroSpeedSystem.D[i][j] = SS.D;
264 zeroSpeedSystem.Ainf(j,i) = zeroSpeedSystem.Ainf(i,j);
265 zeroSpeedSystem.A[j][i] = zeroSpeedSystem.A[i][j];
266 zeroSpeedSystem.B[j][i] = zeroSpeedSystem.B[i][j];
267 zeroSpeedSystem.C[j][i] = zeroSpeedSystem.C[i][j];
268 zeroSpeedSystem.D[j][i] = zeroSpeedSystem.D[i][j];
270 std::cout <<
" Zero data" << std::endl;
271 zeroSpeedSystem.Ainf(i,j) = GetAij(i,j,0)[0];
272 zeroSpeedSystem.A[i][j] = Eigen::Matrix<double,1,1>::Zero();
273 zeroSpeedSystem.B[i][j] = Eigen::Matrix<double,1,1>::Zero();
274 zeroSpeedSystem.C[i][j] = Eigen::Matrix<double,1,1>::Zero();
275 zeroSpeedSystem.D[i][j] = Eigen::Matrix<double,1,1>::Zero();
277 zeroSpeedSystem.Ainf(j,i) = GetAij(i,j,0)[0];
278 zeroSpeedSystem.A[j][i] = Eigen::Matrix<double,1,1>::Zero();
279 zeroSpeedSystem.B[j][i] = Eigen::Matrix<double,1,1>::Zero();
280 zeroSpeedSystem.C[j][i] = Eigen::Matrix<double,1,1>::Zero();
281 zeroSpeedSystem.D[j][i] = Eigen::Matrix<double,1,1>::Zero();
285 RadiationApproximation.insert( std::make_pair(0,zeroSpeedSystem));
286 ZeroSpeedIdentificaitonToCache();
289 void GenerateTimeDomainApproximation()
292 if( IdentificationFromCache() )
return;
294 FreqDomainIdent Identification;
295 Identification.SetPotentialData(
this);
296 Identification.IdentificationMethod(FreqDomainIdent::VECTOR_FITTING);
298 for (
unsigned int speed=0; speed < NoSpeed; speed++ )
300 TimeDomainRadiation speedSystem;
302 for(
int i=0; i < 6; i++)
304 for(
int j=0; j <= i; j++)
306 if( (i == 1 || i == 3 || i == 5) && (j==0 || j==2 || j==4) )
continue;
307 if( (j == 1 || j == 3 || j == 5) && (i==0 || i==2 || i==4) )
continue;
309 std::cout <<
"Identifying (i/j) = ("<<speed<<
")(" << i <<
"/" << j <<
") ";
311 if( is2Ddata() && (i==0||j==0)){
312 FreqDomainIdent::StateSpace SS = Identification.IdentifySS(i,j,speed);
313 speedSystem.Ainf(i,j) = Identification.GetAinf(i,j,speed);
314 speedSystem.A[i][j] = SS.A;
315 speedSystem.B[i][j] = SS.B;
316 speedSystem.C[i][j] = SS.C;
317 speedSystem.D[i][j] = SS.D;
319 speedSystem.Ainf(j,i) = speedSystem.Ainf(i,j);
320 speedSystem.A[j][i] = speedSystem.A[i][j];
321 speedSystem.B[j][i] = speedSystem.B[i][j];
322 speedSystem.C[j][i] = speedSystem.C[i][j];
323 speedSystem.D[j][i] = speedSystem.D[i][j];
325 FreqDomainIdent::StateSpace SS = Identification.IdentifySS(i,j);
326 speedSystem.Ainf(i,j) = GetAij(i,j,speed)[0];
327 speedSystem.A[i][j] = Eigen::Matrix<double,1,1>::Zero();
328 speedSystem.B[i][j] = Eigen::Matrix<double,1,1>::Zero();
329 speedSystem.C[i][j] = Eigen::Matrix<double,1,1>::Zero();
330 speedSystem.D[i][j] = Eigen::Matrix<double,1,1>::Zero();
332 speedSystem.Ainf(j,i) = GetAij(i,j,speed)[0];
333 speedSystem.A[j][i] = Eigen::Matrix<double,1,1>::Zero();
334 speedSystem.B[j][i] = Eigen::Matrix<double,1,1>::Zero();
335 speedSystem.C[j][i] = Eigen::Matrix<double,1,1>::Zero();
336 speedSystem.D[j][i] = Eigen::Matrix<double,1,1>::Zero();
339 std::cout <<
"identified new data - " << std::endl;
342 RadiationApproximation.insert( std::make_pair(speed,speedSystem));
344 IdentificaitonToCache();
350 Eigen::Matrix<double,6,6> M = GetMassRigidBody();
352 std::cout <<
"%Ship information form file: " << fname << std::endl;
353 std::cout <<
"%\tLpp:\t" << Lpp << std::endl;
354 std::cout <<
"%\tB:\t" << Bredth << std::endl;
355 std::cout <<
"%\tT:\t" << Draught << std::endl;
356 std::cout <<
"%\tr_cg\t" << LCG<<
"\t,\t0\t,\t"<<VCG<<
" (from AP and base line)" << std::endl;
357 std::cout <<
"%\tr_cb\t" << LCB<<
"\t,\t0\t,\t"<<VCB<<
" (from AP and base line)" << std::endl;
359 std::cout <<
"%\tPotential data set information: " << std::endl;
360 std::cout <<
"%\t\tNumber of speeds:\t" <<NoSpeed<< std::endl;
361 std::cout <<
"speed = [\t\t" ;
362 for(
unsigned int i=0; i < NoSpeed; i++ ) std::cout << Speed[i] <<
"\t";
363 std::cout <<
"];" << std::endl;
365 std::cout <<
"%\t\tNumber of headings:\t" <<NoHeading<< std::endl;
366 std::cout <<
"head =[\t\t" ;
367 for(
unsigned int i=0; i < NoHeading; i++ ) std::cout << Heading[i] <<
"\t";
368 std::cout <<
"];" << std::endl;
370 std::cout <<
"%\t\tNumber of frequencies:\t" <<NoFrequency<< std::endl;
371 std::cout <<
"freq =[\t\t" ;
372 for(
unsigned int i=0; i < NoFrequency; i++ ) std::cout << Frequency[i] <<
"\t";
373 std::cout <<
"];" << std::endl;
375 for(
unsigned int i=0; i < NoSpeed; i++ )
377 std::cout <<
"%Total mass matrix for Speed " << i <<
" V="<<Speed[i] <<
" m/s" << std::endl;
379 Eigen::Matrix<double,6,6> Ainf = GetAinf(i);
381 Eigen::Matrix<double,6,6> Mtotal = M + Ainf;
382 std::cout << std::scientific;
383 for(
int j=0; j < 6; j++)
385 if( j== 0) std::cout <<
"M{" <<i+1<<
"}\t=[";
386 std::cout <<std::setprecision(4) <<
"\t"<< Mtotal(j,0) <<
"\t," << Mtotal(j,1) <<
"\t," << Mtotal(j,2) <<
"\t," << Mtotal(j,3) <<
"\t," << Mtotal(j,4) <<
"\t,"<<Mtotal(j,5);
387 if( j== 5) std::cout <<
"];";
388 std::cout <<
";" <<std::endl;
394 for(
unsigned int i=0; i < NoSpeed; i++)
396 std::cout <<
"%Fluid memory model for Speed " << i <<
" V="<<Speed[i] <<
" m/s" << std::endl;
397 TimeDomainRadiation mod = RadiationApproximation[i];
399 for(
int j=0; j < 6; j++ )
401 for(
int k=0; k < 6; k++ )
403 size_t num_states = mod.A[k][j].cols();
405 if( num_states == 1 )
407 std::cout <<
"A{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
"=\t" <<
"[" << mod.A[j][k](0,0) <<
"];"<< std::endl;
408 std::cout << std::endl;
409 std::cout <<
"B{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
" =\t" <<
"[" << mod.B[j][k](0,0) <<
"];"<< std::endl;
410 std::cout << std::endl;
411 std::cout <<
"C{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
" =\t" <<
"[" << mod.C[j][k](0,0) <<
"];"<< std::endl;
412 std::cout << std::endl;
413 std::cout <<
"D{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}" <<
" =\t" <<
"[" << mod.D[j][k](0,0) <<
"];"<< std::endl;
415 else if (num_states == 2 )
417 std::cout <<
"A{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.A[j][k](0,0) <<
"\t,"<<mod.A[j][k](0,1)<<
"\t;" << mod.A[j][k](1,0) <<
"\t,"<<mod.A[j][k](1,1)<<
"\t;"<<
"];"<< std::endl;
418 std::cout << std::endl;
419 std::cout <<
"B{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.B[j][k](0,0) <<
"\t;" << mod.B[j][k](1,0) <<
"];"<< std::endl;
420 std::cout << std::endl;
421 std::cout <<
"C{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.C[j][k](0,0) <<
"\t," << mod.C[j][k](0,1) <<
"];"<< std::endl;
422 std::cout << std::endl;
423 std::cout <<
"D{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.D[j][k](0,0) <<
"];"<< std::endl;
428 std::cout <<
"A{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[";
429 for(
size_t s=0; s < num_states; s++)
431 if(s!=0) std::cout <<
" \t ";
432 for(
size_t c=0; c < num_states; c++)
434 std::cout << mod.A[j][k](s,c);
435 if( c < (num_states-1) ) std::cout <<
"\t,";
437 if( s < (num_states-1) ) std::cout << std::endl;
439 std::cout <<
"];"<< std::endl;
441 std::cout << std::endl;
442 std::cout <<
"B{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[";
443 for(
size_t s=0; s < num_states; s++)
445 if( s != 0 )std::cout <<
" \t ";
446 std::cout << mod.B[j][k](s,0);
447 if( s < (num_states-1) ) std::cout <<
";" <<std::endl;
449 std::cout <<
"];"<< std::endl;
450 std::cout << std::endl;
452 std::cout <<
"C{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[";
453 for(
size_t s=0; s < num_states; s++)
455 std::cout << mod.C[j][k](0,s);
456 if( s < (num_states-1) ) std::cout <<
",";
458 std::cout <<
"];"<< std::endl;
460 std::cout << std::endl;
461 std::cout <<
"D{"<<i+1<<
"}{"<<j+1<<
"}{"<<k+1<<
"}"<<
" =\t" <<
"[" << mod.D[j][k](0,0) <<
"];"<< std::endl;
468 size_t GetTimeDomainStateSize(
int DOF1,
int DOF2,
int SpeedNo=0 )
470 return RadiationApproximation[SpeedNo].A[DOF1][DOF2].cols();
473 void ZeroSpeedIdentificaitonToCache()
475 std::string cachebase = fname;
476 std::stringstream ss; ss << cachebase <<
".identcache0";
478 std::fstream cache(ss.str().c_str(),std::ios::out|std::ios::binary);
485 for(
int i=0; i < 6; i++)
487 for(
int j=0; j < 6; j++)
492 a_size[0] =
static_cast<int>(RadiationApproximation[0].A[i][j].rows());
493 a_size[1] =
static_cast<int>(RadiationApproximation[0].A[i][j].cols());
495 cache.write(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
496 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].A[i][j].data()),
sizeof(
double)*a_size[0]*a_size[1] );
501 b_size[0] =
static_cast<int>(RadiationApproximation[0].B[i][j].rows());
502 b_size[1] =
static_cast<int>(RadiationApproximation[0].B[i][j].cols());
504 cache.write(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
505 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].B[i][j].data()),
sizeof(
double)*b_size[0]*b_size[1] );
511 c_size[0] =
static_cast<int>(RadiationApproximation[0].C[i][j].rows());
512 c_size[1] =
static_cast<int>(RadiationApproximation[0].C[i][j].cols());
514 cache.write(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
515 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].C[i][j].data()),
sizeof(
double)*c_size[0]*c_size[1] );
520 d_size[0] =
static_cast<int>(RadiationApproximation[0].D[i][j].rows());
521 d_size[1] =
static_cast<int>(RadiationApproximation[0].D[i][j].cols());
523 cache.write(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
524 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].D[i][j].data()),
sizeof(
double)*d_size[0]*d_size[1] );
530 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[0].Ainf.data()),
sizeof(
double)*6*6 );
534 bool ZeroSpeedIdentificationFromCache()
536 std::string cachebase = fname;
537 std::stringstream ss; ss << cachebase <<
".identcache0";
538 std::fstream cache(ss.str().c_str(),std::ios::in|std::ios::binary);
539 if( !cache.good() )
return false;
550 double Ainf_tmp[6*6];
551 TimeDomainRadiation radiationModel;
552 for(
int i=0; i < 6; i++)
554 for(
int j=0; j < 6; j++)
556 cache.read(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
557 A_tmp =
new double[a_size[0]*a_size[1]];
559 cache.read(
reinterpret_cast<char*
>(A_tmp),
sizeof(
double)*a_size[0]*a_size[1] );
562 cache.read(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
563 B_tmp =
new double[b_size[0]*b_size[1]];
565 cache.read(
reinterpret_cast<char*
>(B_tmp),
sizeof(
double)*b_size[0]*b_size[1] );
567 cache.read(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
568 C_tmp =
new double[c_size[0]*c_size[1]];
570 cache.read(
reinterpret_cast<char*
>(C_tmp),
sizeof(
double)*c_size[0]*c_size[1] );
573 cache.read(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
574 D_tmp =
new double[d_size[0]*d_size[1]];
576 cache.read(
reinterpret_cast<char*
>(D_tmp),
sizeof(
double)*d_size[0]*d_size[1] );
580 radiationModel.A[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(a_size[0],a_size[1]);
581 radiationModel.B[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(b_size[0],b_size[1]);
582 radiationModel.C[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(c_size[0],c_size[1]);
583 radiationModel.D[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(d_size[0],d_size[1]);
585 for(
int k=0; k < a_size[0]; k++)
586 for(
int l=0; l < a_size[1]; l++)
588 assert(a_size[0]*a_size[1] > (l+k*a_size[1]) );
589 radiationModel.A[i][j](k,l) = A_tmp[k+l*a_size[0]];
591 for(
int k=0; k < b_size[0]; k++)
592 for(
int l=0; l < b_size[1]; l++)
594 assert(b_size[0]*b_size[1] > (l+k*b_size[1]) );
595 radiationModel.B[i][j](k,l) = B_tmp[k+l*b_size[0]];
598 for(
int k=0; k < c_size[0]; k++)
599 for(
int l=0; l < c_size[1]; l++)
601 assert(c_size[0]*c_size[1] > (l+k*c_size[1]) );
602 radiationModel.C[i][j](k,l) = C_tmp[k+l*c_size[0]];
604 for(
int k=0; k < d_size[0]; k++)
605 for(
int l=0; l < d_size[1]; l++)
607 assert(d_size[0]*d_size[1] > (l+k*d_size[1]) );
608 radiationModel.D[i][j](k,l) = D_tmp[k+l*d_size[0]];
617 cache.read(
reinterpret_cast<char*
>(Ainf_tmp),
sizeof(double)*6*6);
619 for(
int i=0; i < 6; i++)
620 for(
int j=0; j < 6; j++)
621 radiationModel.Ainf(i,j)=Ainf_tmp[j+i*6];
623 radiationModel.Speed = 0;
624 RadiationApproximation.insert( std::make_pair(0,radiationModel) );
629 void IdentificaitonToCache()
631 std::string cachebase = fname;
632 std::stringstream ss; ss << cachebase <<
".identcache1";
634 std::fstream cache(ss.str().c_str(),std::ios::out|std::ios::binary);
641 cache.write(
reinterpret_cast<char*
>(&NoSpeed),
sizeof(
unsigned int) );
643 for(
unsigned int SpeedIdx=0; SpeedIdx < NoSpeed; SpeedIdx++)
645 double MySpeed = Speed[SpeedIdx];
647 cache.write(
reinterpret_cast<char*
>(&MySpeed),
sizeof(
double) );
648 for(
int i=0; i < 6; i++)
650 for(
int j=0; j < 6; j++)
655 a_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].A[i][j].rows());
656 a_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].A[i][j].cols());
658 cache.write(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
659 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].A[i][j].data()),
sizeof(
double)*a_size[0]*a_size[1] );
664 b_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].B[i][j].rows());
665 b_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].B[i][j].cols());
667 cache.write(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
668 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].B[i][j].data()),
sizeof(
double)*b_size[0]*b_size[1] );
673 c_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].C[i][j].rows());
674 c_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].C[i][j].cols());
676 cache.write(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
677 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].C[i][j].data()),
sizeof(
double)*c_size[0]*c_size[1] );
682 d_size[0] =
static_cast<int>(RadiationApproximation[SpeedIdx].D[i][j].rows());
683 d_size[1] =
static_cast<int>(RadiationApproximation[SpeedIdx].D[i][j].cols());
685 cache.write(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
686 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].D[i][j].data()),
sizeof(
double)*d_size[0]*d_size[1] );
691 cache.write(
reinterpret_cast<char*
>(RadiationApproximation[SpeedIdx].Ainf.data()),
sizeof(
double)*6*6 );
696 bool IdentificationFromCache()
698 std::string cachebase = fname;
699 std::stringstream ss; ss << cachebase <<
".identcache1";
700 std::fstream cache(ss.str().c_str(),std::ios::in|std::ios::binary);
701 if( !cache.good() )
return false;
712 double Ainf_tmp[6*6];
714 cache.read(
reinterpret_cast<char*
>(&NoSpeed),
sizeof(
unsigned int) );
716 for(
unsigned int SpeedIdx=0; SpeedIdx < NoSpeed; SpeedIdx++)
720 cache.read(
reinterpret_cast<char*
>(&MySpeed),
sizeof(
double) );
722 TimeDomainRadiation radiationModel;
723 for(
int i=0; i < 6; i++)
725 for(
int j=0; j < 6; j++)
727 cache.read(
reinterpret_cast<char*
>(a_size),
sizeof(a_size) );
728 A_tmp =
new double[a_size[0]*a_size[1]];
730 cache.read(
reinterpret_cast<char*
>(A_tmp),
sizeof(
double)*a_size[0]*a_size[1] );
732 cache.read(
reinterpret_cast<char*
>(b_size),
sizeof(b_size) );
733 B_tmp =
new double[b_size[0]*b_size[1]];
735 cache.read(
reinterpret_cast<char*
>(B_tmp),
sizeof(
double)*b_size[0]*b_size[1] );
737 cache.read(
reinterpret_cast<char*
>(c_size),
sizeof(c_size) );
738 C_tmp =
new double[c_size[0]*c_size[1]];
740 cache.read(
reinterpret_cast<char*
>(C_tmp),
sizeof(
double)*c_size[0]*c_size[1] );
742 cache.read(
reinterpret_cast<char*
>(d_size),
sizeof(d_size) );
743 D_tmp =
new double[d_size[0]*d_size[1]];
745 cache.read(
reinterpret_cast<char*
>(D_tmp),
sizeof(
double)*d_size[0]*d_size[1] );
748 radiationModel.A[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(a_size[0],a_size[1]);
749 radiationModel.B[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(b_size[0],b_size[1]);
750 radiationModel.C[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(c_size[0],c_size[1]);
751 radiationModel.D[i][j] = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>::Zero(d_size[0],d_size[1]);
753 for(
int k=0; k < a_size[0]; k++)
754 for(
int l=0; l < a_size[1]; l++)
756 assert(a_size[0]*a_size[1] > (l+k*a_size[1]) );
757 radiationModel.A[i][j](k,l) = A_tmp[k+l*a_size[0]];
759 for(
int k=0; k < b_size[0]; k++)
760 for(
int l=0; l < b_size[1]; l++)
762 assert(b_size[0]*b_size[1] > (l+k*b_size[1]) );
763 radiationModel.B[i][j](k,l) = B_tmp[k+l*b_size[0]];
766 for(
int k=0; k < c_size[0]; k++)
767 for(
int l=0; l < c_size[1]; l++)
769 assert(c_size[0]*c_size[1] > (l+k*c_size[1]) );
770 radiationModel.C[i][j](k,l) = C_tmp[k+l*c_size[0]];
772 for(
int k=0; k < d_size[0]; k++)
773 for(
int l=0; l < d_size[1]; l++)
775 assert(d_size[0]*d_size[1] > (l+k*d_size[1]) );
776 radiationModel.D[i][j](k,l) = D_tmp[k+l*d_size[0]];
785 cache.read(
reinterpret_cast<char*
>(Ainf_tmp),
sizeof(double)*6*6);
787 for(
int i=0; i < 6; i++)
788 for(
int j=0; j < 6; j++)
789 radiationModel.Ainf(i,j)=Ainf_tmp[j+i*6];
791 radiationModel.Speed = MySpeed;
792 RadiationApproximation.insert( std::make_pair(SpeedIdx, radiationModel ));
799 void RadiationDerivative(
int DOF1,
int DOF2,
double *derivative,
const double *
const radiation_state,
const double *ship_state,
unsigned int SpeedNo=0 )
801 const TimeDomainRadiation& radiationModel = RadiationApproximation[SpeedNo];
803 const size_t state_size = radiationModel.A[DOF1][DOF2].cols();
804 Eigen::Map<const Eigen::MatrixXd,Eigen::Unaligned> X(radiation_state,state_size,1);
805 Eigen::Map<Eigen::MatrixXd,Eigen::Unaligned> dotX(derivative,state_size,1);
806 dotX.noalias() = radiationModel.A[DOF1][DOF2]*X + radiationModel.B[DOF1][DOF2]*ship_state[DOF2];
809 double RadiationOutput(
int DOF1,
int DOF2,
const double *
const radiation_state,
const double *
const ship_state,
unsigned int SpeedNo=0)
811 const TimeDomainRadiation& radiationModel = RadiationApproximation[SpeedNo];
813 const size_t state_size = radiationModel.A[DOF1][DOF2].cols();
814 Eigen::Map<const Eigen::MatrixXd,Eigen::Unaligned> X(radiation_state,state_size,1);
815 return (radiationModel.C[DOF1][DOF2]*X + radiationModel.D[DOF1][DOF2]*ship_state[DOF2]).value();
819 std::map<int,TimeDomainRadiation,std::less<int>,Eigen::aligned_allocator<std::pair<const int,TimeDomainRadiation> > > RadiationApproximation;
823 virtual bool is2Ddata(){
829 std::vector<std::string> m_warnings;
832 double Lpp = std::numeric_limits<double>::quiet_NaN(), Bredth = std::numeric_limits<double>::quiet_NaN(), Draught = std::numeric_limits<double>::quiet_NaN();
834 double LCG = std::numeric_limits<double>::quiet_NaN(), VCG = std::numeric_limits<double>::quiet_NaN();
835 double LCB = std::numeric_limits<double>::quiet_NaN(), VCB = std::numeric_limits<double>::quiet_NaN();
838 unsigned int NoSpeed;
839 unsigned int NoHeading;
841 unsigned int NoFrequency;
843 double *Speed =
nullptr;
844 double *Heading =
nullptr;
845 double **Frequency =
nullptr;
847 FroudeKrylovForce *FroudeFrylov =
nullptr;
848 WaveDriftForce *WaveDrift =
nullptr;
850 Eigen::Matrix<double,6,6> Mrbeig;
851 Eigen::Matrix<double,6,6> **A;
852 Eigen::Matrix<double,6,6> **B;
853 Eigen::Matrix<double,6,6> **C;
854 Eigen::Matrix<double,6,6> **Aadd;
855 Eigen::Matrix<double,6,6> **Badd;
856 Eigen::Matrix<double,6,6> **Cadd;
858 Eigen::Matrix<double,3,1> rg;
859 Eigen::Matrix<double,3,1> ro;
860 std::map<std::string,double> param;