using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.VisualBasic; namespace vcsSWG { struct DRAWPARA { public int kpt; //拡大率(画面表示:1,ファイル保存:2) public int HSIZE; //画像横寸法(px) public int DHL; //画像左余白寸法:縦軸描画用(px) public int DHR; //画像右余白寸法(px) public int VSIZE; //画像縦寸法(px) public int DVL; //画像下余白寸法:横軸描画用(px) public int DVU; //画像上余白寸法(px) public string sxjiku; //x軸名(単位含む) public double xmin; //x軸最小値 public double xmax; //x軸最大値 public double dx; //x軸増分 public string slogx; //x軸の種類(L:対数,N:普通) public string syjiku; //y軸名(単位含む) public double ymin; //y軸最小値 public double ymax; //y軸最大値 public double dy; //y軸増分 public string slogy; //y軸の種類(L:対数,N:普通) public int kxi0; //グラフ左端座標 public int kxf0; //グラフ右端座標 public int kyi0; //グラフ上端座標 public int kyf0; //グラフ下端座標 } public partial class Form1 : Form { const double pi=Math.PI; public Form1() { InitializeComponent(); } //--------------------------------------------------------------------------------- private void Form1_Load(object sender, EventArgs e) { toolStripLabel1.Text = "繰返回数"; toolStripLabel2.Text = "誤差(目標SP定義範囲)"; toolStripLabel3.Text = "誤差(全体)"; } //--------------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { toolStripLabel1.Text = "繰返回数"; toolStripLabel2.Text = "誤差(目標SP定義範囲)"; toolStripLabel3.Text = "誤差(全体)"; main_part(); MessageBox.Show("計算完了", "完了通知"); } //--------------------------------------------------------------------------------- private void main_part() { double dt; //時刻歴波形サンプリングピッチ int ndata; //時刻歴波形データ数 int nn; //FFTにかけるデータ数(2の累乗) int nfold; //折り曲げ振動数を与える番号に1を加算した数値 double h=0.05; //減衰定数 double ddymax; //最大加速度 double dymax; //最大速度 double ymax; //最大変位 double eps1=0.0; //目標スペクトル定義周期範囲での誤差 double eps2=0.0; //全誤差 double rk; //目標スペクトルと模擬地震波応答スペクトルの加速度比 double org_t_st; //原種波形のうち採用開始時刻 double org_t_ed; //原種波形のうち採用完了時刻 int tsp_nd; //目標スペクトル定義点数 double work1,work2; int kc; int i,j,k,kkk; double x1 = 0.0, y1 = 0.0, x2 = 0.0, y2 = 0.0, xx = 0.0; System.IO.StreamReader sr; System.IO.StreamWriter sw; string[] sbuf; char delim = ','; string dat; string fname1 = ""; //原種波形入力ファイル(csv) string fname2 = ""; //目標スペクトル入力ファイル(csv) string fname3 = ""; //応答スペクトル出力ファイル(csv) string fname4 = ""; //模擬波形時刻歴出力ファイル(csv) string fnameFIG = ""; //画像保存ファイル名(png) DRAWPARA pltdata; //作図用パラメータ //********************************************* //データ読み込み //********************************************* //+++++++++++++++++++++++++++++++++++++++++++++ //原種波形読み込み //+++++++++++++++++++++++++++++++++++++++++++++ openFileDialog1.Title = "原種波形読み込み"; openFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); if (openFileDialog1.ShowDialog() == DialogResult.OK) fname1 = openFileDialog1.FileName; sr = new System.IO.StreamReader(fname1, System.Text.Encoding.Default); dat = sr.ReadLine(); dat = sr.ReadLine(); sbuf = dat.Split(delim); dt = double.Parse(sbuf[1]); dat = sr.ReadLine(); sbuf = dat.Split(delim); ndata = int.Parse(sbuf[1]); double[] org_wave = new double[ndata];//原種波形時刻歴加速度 for (i = 1; i <= ndata; i++) { dat = sr.ReadLine(); sbuf = dat.Split(delim); org_wave[i - 1] = double.Parse(sbuf[0]); } sr.Close(); label1.Text = fname1; //+++++++++++++++++++++++++++++++++++++++++++++ //原種波形時刻歴画面描画 //+++++++++++++++++++++++++++++++++++++++++++++ double[] ddy = new double[ndata]; //加速度時刻歴 double[] dy = new double[ndata]; //速度時刻歴 double[] y = new double[ndata]; //変位時刻歴 string[] scom=new string[3]; int ncase; int[] nda=new int [3]; double[,] datax=new double[3,ndata]; double[,] datay=new double[3,ndata]; ncase = 0; scom[0] = "原種波形"; nda[0] = ndata - 1; ddymax = 0.0; for(i=0;i<=nda[0];i++){ datax[0, i] = dt * (double)i; datay[0, i] = org_wave[i]; if(ddymax=2;i--){ TK[nfold - i] = dt * (double)nn / (double)(i - 1); } TK[nfold - 1] = 2.0 * dt * (double)nn; //目標スペクトルの加速度値セット for(i=0;i<=nfold-1;i++){ if(TK[i]= k) { j = j - k; k = (int)(k / 2); if (k == 0) break; } j = j + k; } } //--------------------------------------------------------------------------------- private void ERES(int nn, double dt, double h, double[] ddy, int nt, double[] tk, double[] resacc, double[] resvel, double[] resdis) { //応答値算出 //nn :加速度時刻歴総数 //dt :時間間隔(入力値) //h :減衰定数(入力値) //ddy[] :加速度時刻歴(入力値) //nt :計算周期総数[データ格納0〜nt-1](入力値) //tk[] :計算周期(入力値) //resacc[]:加速度応答スペクトル(計算値) //resvel[]:速度応答スペクトル(計算値) //resdis[]:変位応答スペクトル(計算値) int i, m; double accmax, velmax, dismax;//応答最大値(gal,kine,cm) double w, w2, hw, wd, wdt, e, cwdt, swdt; double ss, cc, s1, c1, s2, c2, s3, c3; double A11, A12, A21, A22, B11, B12, B21, B22; double dxf, xf, ddym, ddyf, x, dx, ddx; for (i = 0; i <= nt - 1; i++) { w = 2.0 * pi / tk[i]; w2 = w * w; hw = h * w; wd = w * Math.Sqrt(1.0 - h * h); wdt = wd * dt; e = Math.Exp(-hw * dt); cwdt = Math.Cos(wdt); swdt = Math.Sin(wdt); A11 = e * (cwdt + hw * swdt / wd); A12 = e * swdt / wd; A21 = -e * w2 * swdt / wd; A22 = e * (cwdt - hw * swdt / wd); ss = -hw * swdt - wd * cwdt; cc = -hw * cwdt + wd * swdt; s1 = (e * ss + wd) / w2; c1 = (e * cc + hw) / w2; s2 = (e * dt * ss + hw * s1 + wd * c1) / w2; c2 = (e * dt * cc + hw * c1 - wd * s1) / w2; s3 = dt * s1 - s2; c3 = dt * c1 - c2; B11 = -s2 / wdt; B12 = -s3 / wdt; B21 = (hw * s2 - wd * c2) / wdt; B22 = (hw * s3 - wd * c3) / wdt; accmax = 2.0 * hw * Math.Abs(ddy[0]) * dt; velmax = Math.Abs(ddy[0]) * dt; dismax = 0.0; dxf = -ddy[0] * dt; xf = 0.0; for (m = 1; m <= nn - 1; m++) { ddym = ddy[m]; ddyf = ddy[m - 1]; x = A12 * dxf + A11 * xf + B12 * ddym + B11 * ddyf; dx = A22 * dxf + A21 * xf + B22 * ddym + B21 * ddyf; ddx = -2.0 * hw * dx - w2 * x; if (accmax <= Math.Abs(ddx)) accmax = Math.Abs(ddx); if (velmax <= Math.Abs(dx)) velmax = Math.Abs(dx); if (dismax <= Math.Abs(x)) dismax = Math.Abs(x); dxf = dx; xf = x; } resacc[i] = accmax; resvel[i] = velmax; resdis[i] = dismax; } } //--------------------------------------------------------------------------- private void IACC(int nn, double dt, double[] ddy, double[] dy, double[] y, out double ddymax, out double dymax, out double ymax) { //加速度時刻歴数値積分 //nn:加速度時刻歴データ総数 //dt :時間間隔(入力値) //ddy[] :加速度時刻歴(入力値) //dy[] :速度時刻歴(計算出力) //y[] :変位時刻歴(計算出力値) //ddymax:加速度最大値(計算出力値) //dymax :速度最大値(計算出力値) //ymax :変位最大値(計算出力値) int i; ddymax = 0.0; dymax = 0.0; ymax = 0.0; dy[0] = 0.0; y[0] = 0.0; for (i = 1; i <= nn - 1; i++) { dy[i] = dy[i - 1] + (ddy[i - 1] + ddy[i]) * dt / 2.0; y[i] = y[i - 1] + dy[i - 1] * dt + (ddy[i - 1] / 3.0 + ddy[i] / 6.0) * dt * dt; if (ddymax < Math.Abs(ddy[i])) ddymax = Math.Abs(ddy[i]); if (dymax < Math.Abs(dy[i])) dymax = Math.Abs(dy[i]); if (ymax < Math.Abs(y[i])) ymax = Math.Abs(y[i]); } } //--------------------------------------------------------------------------- private void CRAC(int nn, double dt, double[] ddy, double[] dy, double[] y, double ddymax, double dymax, double ymax) { //加速度時刻歴基線補正 //nn:加速度時刻歴データ総数 //dt :時間間隔(入力値) //ddy[] :加速度時刻歴(入力値・書換出力値) //dy[] :速度時刻歴(入力値) //y[] :変位時刻歴(入力値) //ddymax:加速度最大値(入力値) //dymax :速度最大値(入力値) //ymax :変位最大値(入力値) int i; double tt, t, sum, a1, a0, acmax, coef; tt = (double)(nn - 1) * dt; t = 0.0; for (i = 0; i <= nn - 1; i++) { y[i] = y[i] * (3.0 * tt - 2.0 * t) * t * t; t = t + dt; } sum = (y[0] + y[nn - 1]) / 2.0; for (i = 1; i <= nn - 2; i++) { sum = sum + y[i]; } sum = sum * dt; a1 = 28.0 / 13.0 / tt / tt * (2.0 * dy[nn - 1] - 15.0 / Math.Pow(tt, 5.0) * sum); a0 = dy[nn - 1] / tt - a1 / 2.0 * tt; t = 0.0; acmax = 0.0; for (i = 0; i <= nn - 1; i++) { ddy[i] = ddy[i] - a0 - a1 * t; if (acmax < Math.Abs(ddy[i])) acmax = Math.Abs(ddy[i]); t = t + dt; } coef = ddymax / acmax; for (i = 0; i <= nn - 1; i++) { ddy[i] = ddy[i] * coef; } } //--------------------------------------------------------------------------- private void PLTCTL(DRAWPARA pltdata, int ncase,int[] nda, double[,] datax, double[,] datay, string[] scom) { //nda[]:データ数(入力はデータ数,プログラム上数値はデータ数−1) //datax[,]:プロットデータx座標 //datay[,]:プロットデータy座標 int i,kk; PictureBox thePicBox = pictureBox1; Bitmap bmp; Graphics g; //データ対数値処理 for (kk = 0; kk <= ncase;kk++){ if (pltdata.slogx == "L") { for (i = 0; i <= nda[kk]; i++) { if (datax[kk, i] < Math.Pow(10.0, pltdata.xmin)) datax[kk, i] = Math.Pow(10.0, pltdata.xmin); datax[kk, i] = Math.Log10(datax[kk, i]); } } if (pltdata.slogy == "L") { for (i = 0; i <= nda[kk]; i++) { if (datay[kk,i] < Math.Pow(10.0, pltdata.ymin))datay[kk,i] = Math.Pow(10.0, pltdata.ymin); datay[kk,i] = Math.Log10(datay[kk,i]); } } } for (i = 0; i <= 1; i++) { switch (i) { case 0: //画面描画} pltdata.kpt = 1; thePicBox = pictureBox1; thePicBox.Visible = true; break; case 1: //画像書き出し pltdata.kpt = 2; thePicBox = pictureBox2; thePicBox.Visible = false; break; } thePicBox.Size = new Size(pltdata.kpt * pltdata.HSIZE, pltdata.kpt * pltdata.VSIZE); bmp = new Bitmap(thePicBox.Width, thePicBox.Height); thePicBox.Image = bmp; g = Graphics.FromImage(thePicBox.Image); g.FillRectangle(Brushes.White, 0, 0, thePicBox.Width, thePicBox.Height); PLOT(g, pltdata, ncase, nda, datax, datay, scom); g.Dispose(); } pictureBox1.Left = 0; pictureBox1.Top = toolStrip1.Height; this.ClientSize = new Size(pictureBox1.Width, pictureBox1.Height + toolStrip1.Height); } //--------------------------------------------------------------------------------- private void PLOT(Graphics g, DRAWPARA pltdata, int ncase, int[] nda, double[,] datax, double[,] datay, string[] scom) { int i,kk; int kxi, kxf, kyi, kyf; double xx, yy; int kxx, kyy; int kxx1=0, kyy1=0, kxx2=0, kyy2=0; string str; System.Drawing.Font f = new Font("MSゴシック", pltdata.kpt * 10); System.Drawing.SizeF TextSize1; System.Drawing.SizeF TextSize2; int ds=40; int twmax=0; //凡例描画余白確保 if(0