|
setup diary |
原子軌道の角度部分の立体的な絵を、ソフトを使って書いてみた。webを調べるとpovrayを使って書いている人が多かったが、特殊関数などの定義が面倒だし、Rのrglを使って書いた方が良い気がして、その方針でやってみた。ソースは以下のとおりです。
library(misc3d) library(gsl) theta<-function(x,y,z)acos(z/sqrt(x^2+y^2+z^2)) phi<-function(x,y,z)atan( (sqrt(x^2+y^2)-x)/y )*2 th<- 0:100/100*pi ph<- 0:200/200*2*pi fc <- function(x,y,z)ifelse(fr(theta(x,y,z),phi(x,y,z))<0,'blue','red') fx <- function(t,p)abs(fr(t,p))*sin(t)*cos(p) fy <- function(t,p)abs(fr(t,p))*sin(t)*sin(p) fz <- function(t,p)abs(fr(t,p))*cos(t) for(l in 0:5){ for(m in 0:l){ fr <- function(t,p)legendre_Plm(l,m,cos(t))*cos(m*p) parametric3d(fx, fy, fz, th, ph,color=fc) play3d(spin3d(c(0, 0, 1), 10),5) }}
ライブラリとしては、特殊関数を使うためにrglを使って、プロットにはmisc3dのparametric3dを使った。極座標のphiは、tan(2phi)から計算するようにして、条件分岐を減らすことができた。とりあえず、h軌道ぐらいまで書いて、五秒間10rpmで回すようにしてみたが、分かりやすくなったかな。
SSDをつんだノートにubuntu18.04を入れたら、以外に苦労した。まず、USBメモリにisoを入れて、そこからブートしてインストールを開始した。しかし、swapパーティションを無くすのを忘れたと思ってと中で止めたのがいけなかったか、それ以降苦労することになった。
partitionerが途中で止まって動かないようになってしまったので、レスキューモードで立ち上げたら、最後までインストール出来た。そのためにユーザーの設定がされない状態になってしまった。そこで、同じくレスキューモードでユーザーを作成した。
後で調べたら、今のubuntuはswapパーティションが無くなって、swapファイルになっていたので、最初のインストールを止める必要が無かったことが分かった。
さらに、aptでupdateをすると、「ハッシュサムが適合しません」と出てしまう。そのようなバグも報告されていたようである。/var/lib/apt/lists/*
を消去することによって、この問題も解決した。そして、upgradeをしたら、それなりに使えるようになってきた。
Rを使って結晶内の特定の距離の範囲内にある原子を数え上げるプログラムを作っていたのだが、実行が異様に遅い。いろいろと試してみると、データフレームを結合するために使っているrbindのところで、ほとんどの時間を使っていることが分かった。webで検索してみると、dplyrというlibraryのbind_rowsを使うと速くなるというので、試してみたら、なんとか許容範囲の実行時間になって来た。
しかし、もっと速くできるのでは無いかといろいろと試行錯誤していたら、かなり速くすることに成功した。expand.gridを使うと、指定したすべての組み合わせのデータフレームを作ってくれるので、それを利用した。極端な例でこれを説明しよう。
球の中にある格子点の数を数えるプログラムを作るとしよう。座標をふって球の中にある場合に、データフレームに加えていくということをする場合には、以下のようなプログラムになる。
d<-data.frame(x=c(),y=c(),z=c()) for(x in -10:10){ for(y in -10:10){ for(z in -10:10){ if(x^2+y^2+z^2<100){ d<-rbind(d,data.frame(x=x,y=y,z=z)) } }}}
このrbindが時間をかなり使っているようだ。これをexpand.gridで格子点を作って、それを一度に条件判定をするプログラムは、以下のようになる。
d<-expand.grid(x=-10:10,y=-10:10,z=-10:10) d<-subset(d,x^2+y^2+z^2<100)
このときの実行時間は、数百倍も違う。こんなに違うのかと、少し驚いたが、今後Rを使うときには、このようなことを考慮しようと思う。
最近、タブレットを使う人が増えてきているように感じる。しかし、ipadとPCの間で、直接データの転送をするのは、なかなか面倒らしい。androidの場合には、どうなのか調べてみた。
linuxにUSBで接続すると、dmesgでは認識しているけど、マウントされない。調べてみると、androidはMTPプロトコルを使っているかららしい。そこで、linuxにjmtpfsをインストールして、android側でMTPを有効にすると、自動的にマウントされるようになり、データの転送も自由にできる。アンマウントが
あまりうまく行かないけど。