SCILAB ~ひずみ/加速度応答~

前回、 SCILABで周波数応答関数を計算する  では、大崎順彦(1994)「新・地震動のスペクトル解析入門」を参考にしてSCILABにより地盤の加速度/加速度応答を求めました。

実は大崎(1994)のFESPでは各層中点のひずみの大きさも計算できるようになっています。そこで、同様にSCILABで拵えてみましたので御紹介します。加速度応答の場合ほどに適当な検証方法が実は見当たらないのですが、一応本家のFESPと同じ結果が得られることは確認しています。

 

f:id:S_E_Hyphen:20180303091301p:plain

 

#!/bin/bash
temp=`mktemp ./XXXX`
cat エルセントロ.txt |\
 sharp_cancel |\
 awk 'NR<=800{print $1,-$2}' > $temp

scilab -nw << _SCI_ | sed -e "/^ *$/d"
function [z]=strain_resp(f,b_cond,obj,ref)
// 大崎(1994)§9のFESP.forをSCILAB用に
// 書き直したもの
// ひずみ/加速度応答を求める場合
// [引数]
// f : 周波数(実数)
// b_cond : 境界条件(文字列) 'inner' or 'expose'
// obj : 対象層(整数)
// ref : 基準層(整数)
// [その他]
// nlayer(I),thick(ARRAY),gamma_w(ARRAY),G(ARRAY),
// h_alpha(ARRAY),h_beta(ARRAY)はグローバル変数
// として引き渡す
// [返値]
// 周波数応答関数 Zobj/Zref を返す
// 
omega=2*%pi*f; // 円振動数
h=h_alpha./omega+h_beta; // 減衰定数の算出
gb=G.*(1+2*h*%i); // 複素剛性の算出
P=sqrt(gamma_w./gb/ACC)*%i; // 伝播定数の算出
for layer=1:nlayer-1
 R(layer)=gb(layer)/gb(layer+1)*P(layer)/P(layer+1); // インピーダンス比の算出
end
A(1)=1.;
B(1)=1.;
for layer=1:nlayer-1
 ec=exp(P(layer)*omega*thick(layer));
 ea=A(layer)*ec;
 eb=B(layer)/ec;
 A(layer+1)=((1.+R(layer))*ea+(1.-R(layer))*eb)/2.;
 B(layer+1)=((1.-R(layer))*ea+(1.+R(layer))*eb)/2.;
end

ea=exp(P(obj)*omega*thick(obj)/2.);
eb=1/ea;
zobj=-P(obj)/omega*(A(obj)*ea-B(obj)*eb)*0.01;
if b_cond=='inner' then zref=A(ref)+B(ref); // 内部境界面
elseif b_cond=='expose' then zref=2*A(ref); // 解放基盤面
else error("境界条件が不適当です"); exit; end

z=zobj/zref;
endfunction

nlayer=6; //層の数
thick=[5.0 17.0 13.0 31.0 4.0]; // 層厚(m)
gamma_w=[1.98 1.95 1.94 1.94 1.94 1.83]; // 単位体積重量(tf/m3)
G=[2900. 8000. 13400. 17800 24200 22800]; // せん断弾性係数(tf/m2)
h_alpha=[2. 2. 2. 2. 2. 2.]; // マクスウェル型散乱減衰(地盤の減衰)
h_beta=[0.020 0.032 0.024 0.014 0.010 0.010]; // 履歴減衰型材料減衰(土の減衰)
ACC=9.8; //重力加速度(m/sec2)
ref=1; // 基準層

//エルセントロ波の読み込み
fd=mopen('$temp','r');
[n,t,a0]=mfscanf(-1,fd,'%f %f');
mclose(fd);
ns0=size(a0,'r'); // ns0=800
fs=100; // サンプリング周波数
// 後続のゼロ
a=[a0;zeros(1024-ns0,1)];
ns=size(a,'r'); // ns=1024(2の10乗)
nspe=ns/2+1; // スペクトルの要素数
// ここまででエルセントロ波の読み込み

freq0=[0:fs/ns:fs]; // 周波数軸の設定
x=fft(a,-1); // FFTの実行

for obj=1:nlayer-1
 for i=1:nspe // DCからナイキストまで
  if i==1 then z=0;
  else
   f=freq0(i); // 周波数
   z=strain_resp(f,'inner',obj,ref);
  end // if文の終わり
  st(i)=z*x(i); // strain_respの結果と各周波数の複素フーリェ級数を掛け合わせる
 end // 周波数ループの終わり
 for i=nspe-1:-1:2 // 共役複素数の作成
  st(ns-i+2)=conj(st(i));
 end // 共役作成の終わり

 y=fft(st,+1); // 時間領域に戻す
 mprintf('対象層:%d  最大ひずみ%.4f(%%)\n',obj,max(abs(real(y)))*100); 
 //各層の最大ひずみを表示する 単位を(%)にするためには100を掛ける

end // 層ループの終わり

_SCI_
rm $temp

 

SCILABで周波数応答関数を計算する

地盤の増幅スペクトルを計算します。大崎順彦(1994)のFESPを参考にしました。ですので、大地震時にせん断ひずみが大きくなって剛性率が低下するという「非線形性」にまでは対応できません。

一応、オリジナルのFESPおよび吉田望らのDYNEQ320(弾性材料使用)との比較・検証はやってみました。DYNEQは散乱減衰の設定の仕方が少し異なっているので、近似値を使用しました。

 

f:id:S_E_Hyphen:20180301093901j:plain

しばらくの間、このスクリプトを使って色々試してみようと思っています。

 

#!/bin/bash
temp=`mktemp ./XXXX`
scilab -nw << _SCI_ >$temp

function [z]=acc_resp(f,b_cond,obj,ref)
// 大崎(1994)§9のFESP.forをSCILAB用に
// 書き直したもの
// 加速度-加速度応答を求める
// [引数]
// f : 周波数(実数)
// b_cond : 境界条件(文字列) 'inner' or 'expose'
// obj : 対象層(整数)
// ref : 基準層(整数)
// [その他]
// nlayer(I),thick(ARRAY),gamma_w(ARRAY),G(ARRAY),
// h_alpha(ARRAY),h_beta(ARRAY)はグローバル変数
// として引き渡す
// [返値]
// 周波数応答関数 Zobj/Zref を返す
//                            2018年2月28日 作成
// 
omega=2*%pi*f; // 円振動数
h=h_alpha./omega+h_beta; // 減衰定数の算出
gb=G.*(1+2*h*%i); // 複素剛性の算出
P=sqrt(gamma_w./gb/ACC)*%i; // 伝播定数の算出
for layer=1:nlayer-1
 R(layer)=gb(layer)/gb(layer+1)*P(layer)/P(layer+1); // インピーダンス比の算出
end

A(1)=1.;
B(1)=1.;
for layer=1:nlayer-1
 ec=exp(P(layer)*omega*thick(layer));
 ea=A(layer)*ec;
 eb=B(layer)/ec;
 A(layer+1)=((1.+R(layer))*ea+(1.-R(layer))*eb)/2.;
 B(layer+1)=((1.-R(layer))*ea+(1.+R(layer))*eb)/2.;
end

if b_cond=='inner' then z=(A(obj)+B(obj))/(A(ref)+B(ref)); // 内部境界面
elseif b_cond=='expose' then z=(A(obj)+B(obj))/(2*A(ref)); // 解放基盤面
else error("境界条件が不適当です"); exit; end

endfunction

nlayer=4; //層の数
thick=[3.8 3.2 3.9]; // 層厚(m)
gamma_w=[1.50 1.67 1.85 1.95]; // 単位体積重量(tf/m3)
G=[1200. 2900. 5700. 50000.]; // せん断弾性係数(tf/m2)
h_alpha=[2. 2. 2. 2.]; // マクスウェル型散乱減衰(地盤の減衰)
h_beta=[0.02 0.02 0.02 0.02]; // 履歴減衰型材料減衰(土の減衰)
ACC=9.8; //重力加速度(m/sec2)
obj=1; // 対象層
ref=4; // 基準層

if size(thick,'c')+1 <> nlayer then error("層厚の数が層数と一致しません"); end
if size(gamma_w,'c') <> nlayer then error("単位体積重量の数が層数と一致しません"); end
if size(G,'c') <> nlayer then error("せん断弾性係数の数が層数と一致しません"); end
if size(h_alpha,'c') <> nlayer then error("散乱減衰の数が層数と一致しません"); end
if size(h_beta,'c') <> nlayer then error("材料減衰の数が層数と一致しません"); end
[str,ier]=lasterror();
if ier==10000 then exit; end

df=50/128;
freq0=[0:df:50];
for i=1:size(freq0,'c')
 if i==1 then z=1;
 else
  f=freq0(i); // 周波数
  z=acc_resp(f,'inner',obj,ref);
 end
 mfprintf(6,'%f %f %f\n',freq0(i),real(z),imag(z));
end

_SCI_

cat fesp_out.txt |\
 awk '{print $1,sqrt($2*$2+$3*$3)}' |\
 gmt psxy -JX15c/10c -R0/21/0/8 -BnWeS+t"増幅スペクトルの比較" \
    -Bxa5f1+l"周波数(Hz)" -Bya2f1+l"増幅率" -W2p -K > resp.ps

cat dyneq_out.txt |\
 sed -e "1,2d" |\
 gmt psxy -J -R -B -W1p,red -O -K >> resp.ps

cat $temp |\
 sed -e "/^ *$/d" |\
 awk '{print $1,sqrt($2*$2+$3*$3)}' |\
 gmt psxy -J -R -B -S+0.4c -W1p,blue -O -K >> resp.ps
rm $temp

gmt gmtset FONT_TITLE 16p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_LABEL 12p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_ANNOT_PRIMARY 10p,GothicBBB-Medium-UniJIS-UTF8-H

cat << + |\
gmt pslegend -R -J -Dx11c/9c+w3c/1.6c+jTL -F+p+gwhite -O >> resp.ps
N 1
S 0.2c - 0.4c 0/0/0 2p,black 0.8c 大崎FESP
G 0.1c
S 0.2c - 0.4c 255/0/0 1p,red 0.8c DYNEQ320
G 0.1c
S 0.2c + 0.4c 0/0/255 1p,blue 0.8c SCILAB
+

豚柳川

角田光代さんの「彼女のこんだて帖」(ISBN:9784062770194)の中で、とても美味しそうに思えた豚柳川を、我流でアレンジしてみました。

f:id:S_E_Hyphen:20180224145424j:plain

豚肉 90グラム

ゴボウ  50グラム

ニンジン 50グラム

をサラダ油で軽く炒めます。肉の表面に火が通ったら、絹こし豆腐150グラムとしょうゆ・みりん大さじ各1を加え、ふたをしてしっかり煮ます。

最後に溶き玉子を回し入れて完成です。

 

f:id:S_E_Hyphen:20180224145929j:plain

 

豆腐の入った炒め物に卵を溶き入れたものを、「擬製豆腐」と呼んで母は頻繁に作ってくれていたので、ややそれに近い味わいを求めてみました。ゴボウは入ってなかったと思うけど…。

ただ検索してみたら擬製豆腐って全然違う食べ物を指してますね。

我が家のアレは一体何だったんだろう?

コマンドラインでPDFファイルを一つにまとめる

図に示すように、カレントディレクトリの一つ下の子ディレクトリ(ディレクトリ名:child)にA~Xまでの複数のPDFファイルが存在します。

これらのPDFファイルをとりまとめて1ファイルにするためのシェルスクリプトです。

 

#!/bin/bash
OutputPDF="./OutputPDF.pdf"
declare -a InputPDF=( `ls child/*.pdf` )
cp ${InputPDF[0]} ${OutputPDF}
for (( i=1; i<${#InputPDF[*]}; i++ ))
do
 echo $i ${InputPDF[$i]}
 pdftk ${OutputPDF} ${InputPDF[$i]} \
  cat output temp.pdf
 mv temp.pdf ${OutputPDF}
done

 

f:id:S_E_Hyphen:20180221153013j:plain

ページ順は ls の結果に依存してしまいます。もしページ順を厳密に指定したい場合は、 ls を用いるのではなく、配列変数 InputPDF に子ディレクトリ内のファイル名を直接代入して下さい。

デジカメ写真に日付を表示

昔、デジカメが未だ存在しなかった頃、写真の撮影日をフィルムに直接焼き付けてくれるカメラがありました。当時は、どのような方法を使っていたのかわからなかったのですが、現在ならImageMagickのconvertコマンドと、jheadによるEXIF情報の取得により、簡単にデジカメ写真に日付を挿入することが可能となります。

f:id:S_E_Hyphen:20180213104514j:plain

 

 

#!/bin/bash
sdoc=\
" InsertDate  - JPEGEXIF情報から撮影日を取得し、    \n"\
"                写真右下隅に表示する                  \n"\
"                                                      \n"\
" [ require]                                           \n"\
"    in          入力のJPGファイル                     \n"\
"                                                      \n"\
" [ option ]                                           \n"\
"   foreground  日付の文字色      規定値はwhite       \n"\
"   background  日付の背景色      規定値はnone        \n"\
"                                                      \n"\
" [ 出力 ]                                            \n"\
"    InsertDate in=xxxx.jpg を実行すると               \n"\
"    xxxx_inserted_date.jpg が出力される               \n"\
"    出力されるJPEGファイルの横幅は1000pixelに統一する \n"\
"                                                      \n"
export sdoc

in=`getparstr $# "$*" "in"`
foreground=`getparstr $# "$*" "foreground"`
background=`getparstr $# "$*" "background"`
if [ -z $in ]; then usage;exit; fi
if [ -z $foreground ]
then 
 foreground='#FFFFFF'
fi
if [ -z $background ]
then 
 background='none'
fi

temp=`mktemp ./XXXX.jpg`
convert -resize 1000x1000 ${in} $temp # 1000ピクセルに正規化
OutputJpegFile=`basename ${in} .JPG`_inserted_date.jpg

height=`jhead $temp | grep Resolution | awk '{print $5}'`
width=`jhead $temp | grep Resolution | awk '{print $3}'`
date=`jhead ${in} | grep Date\/Time | awk '{print $3}'| sed -e "s/:/-/g"`

x0=865
x1=860
x2=960
y0=`expr $height - 15`
y1=`expr $height - 10`
y2=`expr $height - 30`

# フォントはTimes-Roman,20pt
# 背景色で長方形を塗りつぶす(880,-10)-(980,-30)
# (885,-15)を左中央として日付を描画
convert -font Times-Roman -pointsize 20 \
-fill ${background} -draw "rectangle $x1,$y1 $x2,$y2" \
-fill ${foreground} -annotate +${x0}+${y0} "${date}"  \
$temp $OutputJpegFile
rm $temp