diff --git a/css/font-awesome.css b/css/font-awesome.css new file mode 100644 index 0000000..4040b3c --- /dev/null +++ b/css/font-awesome.css @@ -0,0 +1,1672 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.2.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} diff --git a/css/font-awesome.min.css b/css/font-awesome.min.css new file mode 100644 index 0000000..ec53d4d --- /dev/null +++ b/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/css/local.css b/css/local.css new file mode 100644 index 0000000..f1a3262 --- /dev/null +++ b/css/local.css @@ -0,0 +1,298 @@ +body { + padding-top: 70px; +} +table.nostretch { + width=100% +} +.nostretch td { + class='block' +} +.nostretch tr td{ + width:1%; + white-space:nowrap; +} + +html { + scroll-padding-top: 70px; +} + +ol.hierarchy { + min-height: 40px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.smallcaps { + font-variant: small-caps; +} +.well .sidebar { + padding: 8px 0 +} +.sidebar a { + padding: 0px,0px,0px,0px +} +.varlist>tbody>tr>td { + padding-left: 3px; + padding-right: 3px; +} +.varlist>tbody>tr>td:first-child, .varlist>thead>tr>td:first-child { + padding-left: 8px; +} +.varlist>tbody>td>td:last-child, .varlist>thead>tr>td:last-child { + padding-right: 8px; +} + +.highlight pre { + overflow-x: auto; + overflow-wrap: normal; + white-space: pre +} + +/* .hl is for when line numbers are included, .highlight is for all + other cases. */ +.hl pre { + counter-reset: line-numbering; + overflow-x: auto; + overflow-wrap: normal; + white-space: pre; + padding: 0; + padding-right: 9.5px; + overflow-y: hidden; + padding-bottom: 9.5px; +} + +.hl pre a::before { + content: counter(line-numbering); + counter-increment: line-numbering; + padding-right: 0.7em; /* space after numbers */ + margin-top: 4.5em; + width: 60px; + text-align: right; + opacity: 0.7; + display: inline-block; + color: #aaa; + background: #eee; + margin-right: 10px; + border-right: 1px solid #ccc; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.hl pre a:first-of-type::before { + padding-top: 9.5px; +} + +.hl pre a:last-of-type::before { + padding-bottom: 9.5px; +} + +.hl pre a:only-of-type::before { + padding: 9.5px; +} + +.hl pre a { + display: inline-block; + height: 4.5em; + margin: -4.5em 0 0; +} +.codesum h3 { + margin-top: 2px; + margin-bottom: 2px; +} + +h1.inline, h2.inline, h3.inline { + display: inline; +} + +.depwarn { + float: right; +} + +.anchor { + position: absolute; + margin: -4.5em; + visibility:hidden; +} + +.alert { + margin-left: 5px; + margin-right: 5px; + margin-top: 5px; +} + +.alert-title { + margin-top: 0; + color: inherit; +} + +div.toc { + font-size: 14.73px; + padding-left: 0px; + padding-right: 0px; +} + +div.toc a { + padding-left: 20px; + padding-right: 20px; + margin-right: 15px; + padding-top: 5px; + padding-bottom: 5px; +} + +div.toc li { + font-size: 0.95em; + padding-left: 15px; +} + +div.toc li.title { + font-size: 1em; +} + +div.toc hr { + margin-top: 12px; + margin-bottom: 10px; +} + +.in-well { + padding: 0px 0px; + margin-bottom: 0px; + float:right; +} + +table tr.submod>td { + border-top: none; + font-size: 13.5px; +} + +.graph-help { + font-size: 10px; +} + +.depgraph { + width: 100%; + max-width: 1140px; +} + +#sidebar a { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.highlighttable { + width: auto; + table-layout: fixed; +} + +ul.checklist { + list-style-type: none; +} + +ul.checklist input[type="checkbox"] { + margin-left: -20.8px; + margin-right: 4.55px; +} + +.gitter-chat-embed { + z-index: 100000; +} + +table.graph { + text-align: center; +} + + +.graph td.root { + border:2px solid black; + padding:10px; +} + +.graph td.triangle-right:after { + content: ""; + display: block; + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + border-left: 7px solid black; +} + +.graph td.triangle-left:after { + content: ""; + display: block; + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + border-right: 7px solid black; +} + +.graph td.node { + color: white; + padding:10px; + border-style: solid; + border-width: 3px 0px 3px 0px; + border-color: white; +} + +.graph td.node a{ + color: white; +} + +.graph td.dashedText, +.graph td.solidText { + padding: 0px 10px 0px 10px; + min-width: 40px; + color: black; + border-color: black; +} + +.graph td.dashedText { + border-bottom-style: dashed; +} + +.graph td.solidText { + border-bottom-style: solid; +} + +.graph td.dashedBottom, +.graph td.dashedTop, +.graph td.solidTop, +.graph td.solidBottom { + min-width: 40px; + color: transparent; + border-color: black; +} + +.graph td.dashedBottom { + border-bottom-style: dashed; +} + +.graph td.dashedTop { + border-top-style: dashed; +} + +.graph td.solidBottom { + border-bottom-style: solid; +} + +.graph td.solidTop { + border-top-style: solid; +} + +/* Ensure tables in Pages don't collapse horizontally */ +td, th { + padding-right: 10px; +} + +.nav>li>a { + padding-left: 10px; + padding-right: 10px; +} + +.nav > .nav { + margin-left: 16px; +} diff --git a/css/pygments.css b/css/pygments.css new file mode 100644 index 0000000..c4b2fd9 --- /dev/null +++ b/css/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.codehilite .hll { background-color: #ffffcc } +.codehilite { background: #f8f8f8; } +.codehilite .c { color: #3D7B7B; font-style: italic } /* Comment */ +.codehilite .err { border: 1px solid #FF0000 } /* Error */ +.codehilite .k { color: #008000; font-weight: bold } /* Keyword */ +.codehilite .o { color: #666666 } /* Operator */ +.codehilite .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.codehilite .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.codehilite .cp { color: #9C6500 } /* Comment.Preproc */ +.codehilite .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.codehilite .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.codehilite .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.codehilite .gd { color: #A00000 } /* Generic.Deleted */ +.codehilite .ge { font-style: italic } /* Generic.Emph */ +.codehilite .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.codehilite .gr { color: #E40000 } /* Generic.Error */ +.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.codehilite .gi { color: #008400 } /* Generic.Inserted */ +.codehilite .go { color: #717171 } /* Generic.Output */ +.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.codehilite .gs { font-weight: bold } /* Generic.Strong */ +.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.codehilite .gt { color: #0044DD } /* Generic.Traceback */ +.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.codehilite .kp { color: #008000 } /* Keyword.Pseudo */ +.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.codehilite .kt { color: #B00040 } /* Keyword.Type */ +.codehilite .m { color: #666666 } /* Literal.Number */ +.codehilite .s { color: #BA2121 } /* Literal.String */ +.codehilite .na { color: #687822 } /* Name.Attribute */ +.codehilite .nb { color: #008000 } /* Name.Builtin */ +.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.codehilite .no { color: #880000 } /* Name.Constant */ +.codehilite .nd { color: #AA22FF } /* Name.Decorator */ +.codehilite .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.codehilite .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.codehilite .nf { color: #0000FF } /* Name.Function */ +.codehilite .nl { color: #767600 } /* Name.Label */ +.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.codehilite .nv { color: #19177C } /* Name.Variable */ +.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.codehilite .w { color: #bbbbbb } /* Text.Whitespace */ +.codehilite .mb { color: #666666 } /* Literal.Number.Bin */ +.codehilite .mf { color: #666666 } /* Literal.Number.Float */ +.codehilite .mh { color: #666666 } /* Literal.Number.Hex */ +.codehilite .mi { color: #666666 } /* Literal.Number.Integer */ +.codehilite .mo { color: #666666 } /* Literal.Number.Oct */ +.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */ +.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */ +.codehilite .sc { color: #BA2121 } /* Literal.String.Char */ +.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */ +.codehilite .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.codehilite .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.codehilite .sx { color: #008000 } /* Literal.String.Other */ +.codehilite .sr { color: #A45A77 } /* Literal.String.Regex */ +.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */ +.codehilite .ss { color: #19177C } /* Literal.String.Symbol */ +.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.codehilite .fm { color: #0000FF } /* Name.Function.Magic */ +.codehilite .vc { color: #19177C } /* Name.Variable.Class */ +.codehilite .vg { color: #19177C } /* Name.Variable.Global */ +.codehilite .vi { color: #19177C } /* Name.Variable.Instance */ +.codehilite .vm { color: #19177C } /* Name.Variable.Magic */ +.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */ diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000..4d6ad16 Binary files /dev/null and b/favicon.png differ diff --git a/fonts/FontAwesome.otf b/fonts/FontAwesome.otf new file mode 100644 index 0000000..81c9ad9 Binary files /dev/null and b/fonts/FontAwesome.otf differ diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..84677bc Binary files /dev/null and b/fonts/fontawesome-webfont.eot differ diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..d907b25 --- /dev/null +++ b/fonts/fontawesome-webfont.svg @@ -0,0 +1,520 @@ + + + \ No newline at end of file diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..96a3639 Binary files /dev/null and b/fonts/fontawesome-webfont.ttf differ diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..628b6a5 Binary files /dev/null and b/fonts/fontawesome-webfont.woff differ diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..4a4ca86 Binary files /dev/null and b/fonts/glyphicons-halflings-regular.eot differ diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..25691af --- /dev/null +++ b/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..67fa00b Binary files /dev/null and b/fonts/glyphicons-halflings-regular.ttf differ diff --git a/fonts/glyphicons-halflings-regular.woff b/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..8c54182 Binary files /dev/null and b/fonts/glyphicons-halflings-regular.woff differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..813218c --- /dev/null +++ b/index.html @@ -0,0 +1,292 @@ + + +
+ + + + + + + +Radbelt: Work in progress to refactor the AE-8/AP-8 Van Allen belt model.
+A Fortran Package Manager manifest file is included, so that the library and test cases can be compiled with FPM. For example:
+fpm build --profile release
+fpm test --profile release
+
To use radbelt
within your fpm project, add the following to your fpm.toml
file:
[dependencies]
+radbelt = { git="https://github.com/jacobwilliams/radbelt.git" }
+
The latest API documentation can be found here. This was generated from the source code using FORD.
+NSSDC-Id PT-11B (combines PT-11A, MT-18A, MT-18B, MT-2AA, MT-2AB)
+
+NAME: Models of trapped particle fluxes AE-8 (electrons) and
+ AP-8 (protons) in inner and outer radiation belts
+
+SOURCE: Dieter Bilitza, GSFC/NSSDC code 633, Greenbelt,
+ MD 20771, tel. (301) 286-0190
+ dbilitza@pop600.gsfc.nasa.gov
+
+CONTENT: 12 files *.* blocks
+ FORTRAN source code:
+ driver program with interface RADBELT.FOR 48
+ subroutines, functions TRMFUN.FOR 30
+
+ model tables binary and ASCII:
+ AE-8, epoch 1964, solar minimum AE8MIN.BIN 104
+ AE-8, epoch 1970, solar maximum AE8MAX.BIN 107
+ AP-8, epoch 1964, solar minimum AP8MIN.BIN 53
+ AP-8, epoch 1970, solar maximum AP8MAX.BIN 52
+ ASCII version of AE8MIN.BIN AE8MIN.ASC 163
+ ASCII version of AE8MAX.BIN AE8MAX.ASC 168
+ ASCII version of AP8MIN.BIN AP8MIN.BIN 83
+ ASCII version of AP8MAX.BIN AP8MAX.BIN 81
+
+ user manual with examples RADBELT.LOG 48
+ This file AAAREADME.DOC 9
+
These empirical models describe the differential or +integral, omnidirectional fluxes of electrons (AE-8) and protons +(AP-8) in the inner and outer radiation belts (electrons: L=1.1 +to 11, protons: L=1.1 to 7) for two epochs representing solar +maximum (1970) and minimum (1964) conditions. The energy spectrum +ranges from 0.1 to 400 MeV for the protons and from 0.04 to 7 MeV +for the electrons. AE-8 and AP-8 are the most recent ones in a +series of models established by J. Vette and his colleges at NSSDC +starting in the early sixties. The models are based on almost all +available satellite data. It is IMPORTANT that the models maps for +solar maximum are used with a magnetic field model for epoch=1970 +and for solar minimum for epoch=1964.
+For each epoch and particle the model consists of a three- +dimensional table of (logarithm of) particle fluxes in energy, L-value, +and B/B0 (magnetic field strength normalized to the equator). The program +MODEL finds the particle fluxes for given energy, L-value and B/B0 by +interpolating in energy (subroutine TRARA1) and in L * B/B0 space (TRARA2). +The program RADBELT produces tables of integral or differential fluxes +for different energies varying with L or B/B0.
+The coefficient files are provided in VAX/VMS binary (.bin) and +ASCII (.asc) format. For all systems other than VMS the use of the ASCII +files is recommended. If using the ASCII coefficient one needs to slightly +modify the RADBELT.FOR program as described in a comment statement in +RADBELT (this comments are found after the OPEN statement for the coefficient +file).
+In March 1995 the earlier used compressed model maps AP8MIC and AP8MAC +were replaced with the full maps AP8MIN/MAX with the help of D. Heynderickx +(BIRA, Brussel, Belgium) and A. Beliaev (INP/MSU, Moscow, Russia). Heynderickx +and Beliaev (1995) had found and corrected a small error in the AP8MIN map; +two lines had been exchanged.
+(1) FORTRAN source code from this directory. +(2) Model parameters can be computed and plotted online at http://nssdc.gsfc.nasa.gov/space/model/ .
+G.W. Singley, and J.I. Vette, The AE-4 Model of the Outer Radiation + Zone Electron Environment, NSSDC/WDC-A-R&S 72-06, 1972.
+M.J. Teague, and J.I. Vette, A Model of the Trapped Electron + Population for Solar Minimum (AE-5), NSSDC/WDC-A-R&S 74-03, 1974.
+M.J. Teague, K.W. Chan, and J.I. Vette, AE-6: A Model Environment + of Trapped Electrons for Solar Maximum, NSSDC/WDC-A-R&S 76-04, 1976
+D.W. Sawyer, and J.I. Vette, AP-8 Trapped Proton Environment for + Solar Maximum and Minimum, NSSDC/WDC-A-R&S 76-06, 1976.
+J.I. Vette, K.W. Chan, and M.J. Teague, Problems in Modeling the + Earth's Trapped Radiation Environment, AFGL-TR-78-0130, 1978.
+K.W. Chan, M.J. Teague, N.J. Schofield, and J.I. Vette, Modeling of + Electron Time Variation in the Radiation Belts, p. 121-149, in: + Quantitative Modeling of Magnetospheric Processes, W.P. Olson + (ed.), geophysical monograph 21, American Geophysical Union, 1979.
+M.T. Teague, N.J. Schofield, K.W. Chan, and J.I. Vette, A Study of + Inner Zone Electron Data and their Comparison with Trapped + Radiation Models, NSSDC/WDC-A-R&S 79-06, 1979.
+J.I. Vette, The AE-8 Trapped Electron Model Environment, + NSSDC/WDC-A-R&S 91-24, 1991.
+J.I. Vette, The NASA/National Space Science Data Center Trapped + Radiation Environment Model Program (1964-1991), NSSDC/WDC-A-R&S + 91-29, 1991.
+(most of these references are available from NSSDC)
+D. Heynderickx and A. Beliaev, J. Spacecraft and Rockets 32, 190-192, 1995.
+File | Description |
---|---|
core.f90 | ++ |
radbelt_kinds_module.F90 | ++ |
shellig.f90 | ++ |
trmfun.f90 | ++ |
Module | Source File | Description |
---|---|---|
core | +core.f90 | +Main module. |
+
radbelt_kinds_module | +radbelt_kinds_module.F90 | +Numeric kind definitions for radbelt. |
+
shellig_module | +shellig.f90 | +IGRF model |
+
trmfun_module | +trmfun.f90 | +Trapped radiation model. |
+
Procedure | Location | Procedure Type | Description |
---|---|---|---|
aep8 | +trmfun_module | +Subroutine | +Main wrapper for the radiation model. +Reads the coefficient file and calls the low-level routine. |
+
extrashc | +shellig_module | +Subroutine | +Extrapolates linearly a spherical harmonic model with a + rate-of-change model. |
+
feldcof | +shellig_module | +Subroutine | +Determines coefficients and dipol moment from IGRF models |
+
feldg | +shellig_module | +Subroutine | +Calculates earth magnetic field from spherical harmonics model |
+
findb0 | +shellig_module | +Subroutine | ++ |
get_flux | +core | +Function | +Main routine. |
+
getshc | +shellig_module | +Subroutine | +Reads spherical harmonic coefficients from the specified + file into an array. |
+
igrf | +shellig_module | +Subroutine | +Wrapper for IGRF functions. |
+
intershc | +shellig_module | +Subroutine | +Interpolates linearly, in time, between two spherical + harmonic models. |
+
shellg | +shellig_module | +Subroutine | +calculates l-value for specified geodaetic coordinates, altitude + and gemagnetic field model. |
+
stoer | +shellig_module | +Subroutine | +subroutine used for field line tracing in shellg +calls entry point feldi in geomagnetic field subroutine feldg |
+
trara1 | +trmfun_module | +Subroutine | +trara1 finds particle fluxes for given energies, magnetic field +strength and l-value. function trara2 is used to interpolate in +b-l-space. |
+
trara2 | +trmfun_module | +Function | +trara2 interpolates linearly in l-b/b0-map to obtain + the logarithm of integral flux at given l and b/b0. |
+
Type | Location | Extends | Description |
---|---|---|---|
shellig_type | +shellig_module | +None | ++ |
trm_type | +trmfun_module | +None | +main class for the |
+
Main module.
+Main routine.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lon | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lat | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +height | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +year | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +e | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +imname | ++ + | +
Numeric kind definitions for radbelt.
+Type | +Visibility | Attributes | ++ | Name | +Initial | + | |
---|---|---|---|---|---|---|---|
+ + integer, + | +public, | ++parameter + | +:: | +wp | += | +real64 | +
+ Real working precision if not specified [8 bytes] + |
+
+ + integer, + | +public, | ++parameter + | +:: | +ip | += | +int32 | +
+ Integer working precision if not specified [4 bytes] + |
+
IGRF model
+Type | +Visibility | Attributes | ++ | Name | +Initial | + | |
---|---|---|---|---|---|---|---|
+ + integer, + | +private, | ++parameter + | +:: | +filename_len | += | +14 | +
+ length of the model data file names + |
+
+ + real(kind=wp), + | +private, | ++parameter + | +:: | +Era | += | +6371.2_wp | +
+ earth radius for normalization of cartesian coordinates (6371.2 km) + |
+
+ + real(kind=wp), + | +private, | ++parameter + | +:: | +erequ | += | +6378.16_wp | ++ + | +
+ + real(kind=wp), + | +private, | ++parameter + | +:: | +erpol | += | +6356.775_wp | ++ + | +
+ + real(kind=wp), + | +private, | ++parameter + | +:: | +Aquad | += | +erequ*erequ | +
+ square of major half axis for +earth ellipsoid as recommended by international +astronomical union + |
+
+ + real(kind=wp), + | +private, | ++parameter + | +:: | +Bquad | += | +erpol*erpol | +
+ square of minor half axis for +earth ellipsoid as recommended by international +astronomical union + |
+
+ + real(kind=wp), + | +private, | ++parameter + | +:: | +Umr | += | +atan(1.0_wp)*4.0_wp/180.0_wp | +
+ atan(1.0)4./180. |
+
+ + real(kind=wp), + | +private, | ++parameter, dimension(3,3) + | +:: | +u | += | +reshape([+0.3511737_wp, -0.9148385_wp, -0.1993679_wp, +0.9335804_wp, +0.3583680_wp, +0.0000000_wp, +0.0714471_wp, -0.1861260_wp, +0.9799247_wp], [3, 3]) | ++ + | +
Type | +Visibility | Attributes | ++ | Name | +Initial | + | |
---|---|---|---|---|---|---|---|
+ + real(kind=wp), + | +private, | ++ dimension(3) + | +:: | +sp | += | +0.0_wp | ++ + | +
+ + real(kind=wp), + | +private, | ++ dimension(3) + | +:: | +xi | += | +0.0_wp | ++ + | +
+ + real(kind=wp), + | +private, | ++ dimension(144) + | +:: | +h | += | +0.0_wp | +
+ Field model coefficients adjusted for shellg + |
+
+ + integer, + | +private | ++ + | +:: | +iyea | += | +0 | +
+ the int year corresponding to the file |
+
+ + character(len=filename_len), + | +private | ++ + | +:: | +name | += | +'' | +
+ file name + |
+
+ + integer, + | +private | ++ + | +:: | +nmax | += | +0 | +
+ maximum order of spherical harmonics + |
+
+ + real(kind=wp), + | +private | ++ + | +:: | +Time | += | +0.0_wp | +
+ year (decimal: 1973.5) for which magnetic field is to be calculated + |
+
+ + real(kind=wp), + | +private, | ++ dimension(144) + | +:: | +g | += | +0.0_wp | +
+
|
+
+ + real(kind=wp), + | +private | ++ + | +:: | +step | += | +0.20_wp | +
+ step size for field line tracing + |
+
+ + real(kind=wp), + | +private | ++ + | +:: | +steq | += | +0.03_wp | +
+ step size for integration + |
+
+ + real(kind=wp), + | +private, | ++ dimension(120) + | +:: | +gh2 | += | +0.0_wp | ++ + | +
procedure, public :: + igrf | ++ |
procedure, public :: + feldcof | ++ |
procedure, public :: + feldg | ++ |
procedure, public :: + shellg | ++ |
procedure, public :: + findb0 | ++ |
procedure, private :: + extrashc | ++ |
procedure, private :: + intershc | ++ |
procedure, private :: + getshc | ++ |
procedure, private :: + stoer | ++ |
Wrapper for IGRF functions.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lon | +
+ geodetic longitude in degrees (east) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lat | +
+ geodetic latitude in degrees (north) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +height | +
+ altitude in km above sea level + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +year | +
+ decimal year for which geomagnetic field is to +be calculated (e.g.:1995.5 for day 185 of 1995) + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +xl | +
+ l-value + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bbx | ++ + | +
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +stps | ++ + | +|
+ + real(kind=wp), + | +intent(inout) | ++ + | +:: | +bdel | ++ + | +|
+ + logical, + | +intent(out) | ++ + | +:: | +value | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bequ | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +rr0 | ++ + | +
calculates l-value for specified geodaetic coordinates, altitude + and gemagnetic field model.
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glat | +
+ GEODETIC LATITUDE IN DEGREES (NORTH) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glon | +
+ GEODETIC LONGITUDE IN DEGREES (EAST) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +alt | +
+ ALTITUDE IN KM ABOVE SEA LEVEL + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dimo | +
+ DIPOL MOMENT IN GAUSS (NORMALIZED TO EARTH RADIUS) + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +fl | +
+ l-value + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +icode | +
+ |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +b0 | +
+ magnetic field strength in gauss + |
+
subroutine used for field line tracing in shellg +calls entry point feldi in geomagnetic field subroutine feldg
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(inout), | ++ dimension(7) + | +:: | +p | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bq | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +r | ++ + | +
Calculates earth magnetic field from spherical harmonics model
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glat | +
+ geodetic latitude in degrees (north) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glon | +
+ geodetic longitude in degrees (east) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +alt | +
+ altitude in km above sea level + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bnorth | +
+ components of the field with respect +to the local geodetic coordinate system, with axis +pointing in the tangential plane to the north, east +and downward. + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +beast | +
+ components of the field with respect +to the local geodetic coordinate system, with axis +pointing in the tangential plane to the north, east +and downward. + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bdown | +
+ components of the field with respect +to the local geodetic coordinate system, with axis +pointing in the tangential plane to the north, east +and downward. + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +Babs | +
+ magnetic field strength in gauss + |
+
Determines coefficients and dipol moment from IGRF models
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +year | +
+ decimal year for which geomagnetic field is to +be calculated (e.g.:1995.5 for day 185 of 1995) + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +dimo | +
+ geomagnetic dipol moment in gauss (normalized +to earth's radius) at the time (year) + |
+
Reads spherical harmonic coefficients from the specified + file into an array.
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + character(len=*), + | +intent(in) | ++ + | +:: | +Fspec | +
+ File specification + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +Nmax | +
+ Maximum degree and order of model + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +Erad | +
+ Earth's radius associated with the spherical +harmonic coefficients, in the same units as +elevation + |
+ |
+ + real(kind=wp), + | +intent(out), | ++ dimension(*) + | +:: | +Gh | +
+ Schmidt quasi-normal internal spherical +harmonic coefficients + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +Ier | +
+ Error number: |
+
Interpolates linearly, in time, between two spherical + harmonic models.
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +date | +
+ Date of resulting model (in decimal year) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dte1 | +
+ Date of earlier model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax1 | +
+ Maximum degree and order of earlier model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh1(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of earlier model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dte2 | +
+ Date of later model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax2 | +
+ Maximum degree and order of later model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh2(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of later model + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +nmax | +
+ Maximum degree and order of resulting model + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +gh(*) | +
+ Coefficients of resulting model + |
+
Extrapolates linearly a spherical harmonic model with a + rate-of-change model.
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +date | +
+ Date of resulting model (in decimal year) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dte1 | +
+ Date of base model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax1 | +
+ Maximum degree and order of base model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh1(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of base model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax2 | +
+ Maximum degree and order of rate-of-change model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh2(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of rate-of-change model + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +nmax | +
+ Maximum degree and order of resulting model + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +gh(*) | +
+ Coefficients of resulting model + |
+
Trapped radiation model.
+trmfun.for
1987Type | +Visibility | Attributes | ++ | Name | +Initial | + | |
---|---|---|---|---|---|---|---|
+ + character(len=10), + | +private, | ++parameter, dimension(4) + | +:: | +mname | += | +['ae8min.asc', 'ae8max.asc', 'ap8min.asc', 'ap8max.asc'] | +
+ data files available + |
+
main class for the aep8
model
Type | +Visibility | Attributes | ++ | Name | +Initial | + | |
---|---|---|---|---|---|---|---|
+ + character(len=:), + | +private, | ++ allocatable + | +:: | +file_loaded | ++ | + |
+ the file that has been loaded + |
+
+ + integer, + | +private, | ++ dimension(8) + | +:: | +ihead | += | +0 | ++ + | +
+ + integer, + | +private, | ++ dimension(:), allocatable + | +:: | +map | ++ | + | + + | +
+ + real(kind=wp), + | +private | ++ + | +:: | +fistep | += | +0.0_wp | +
+ the stepsize for the parameterization of the logarithm of flux.
+formerly stored in common block |
+
+ + real(kind=wp), + | +private | ++ + | +:: | +f1 | += | +1.001_wp | ++ + | +
+ + real(kind=wp), + | +private | ++ + | +:: | +f2 | += | +1.002_wp | ++ + | +
procedure, public :: + aep8 | +../../ main routine |
+
procedure, public :: + trara2 | +../../ low-level routine |
+
procedure, public :: + trara1 | ++ |
trara2 interpolates linearly in l-b/b0-map to obtain + the logarithm of integral flux at given l and b/b0.
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(trm_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +map(*) | +
+ is sub-map (for specific energy) of +trapped radiation model map + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +il | +
+ scaled l-value + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +ib | +
+ scaled b/b0-1 + |
+
scaled logarithm of particle flux
+ +Main wrapper for the radiation model. +Reads the coefficient file and calls the low-level routine.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(trm_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +e | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +l | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +bb0 | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +imname | +
+ which model to load (index in |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +flux | ++ + | +
trara1 finds particle fluxes for given energies, magnetic field +strength and l-value. function trara2 is used to interpolate in +b-l-space.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(trm_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +descr(8) | +
+ header of specified trapped radition model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +map(*) | +
+ map of trapped radition model +(descr and map are explained at the begin +of the main program model) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +fl | +
+ l-value + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +bb0 | +
+ =b/b0 magnetic field strength normalized +to field strength at magnetic equator + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +e(n) | +
+ array of energies in mev + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +f(n) | +
+ decadic logarithm of integral fluxes in +particles/(cmcmsec) + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +n | +
+ number of energies + |
+
Main wrapper for the radiation model. +Reads the coefficient file and calls the low-level routine.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(trm_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +e | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +l | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +bb0 | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +imname | +
+ which model to load (index in |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +flux | ++ + | +
subroutine aep8(me,e,l,bb0,imname,flux) + + class(trm_type),intent(inout) :: me + + real(wp),intent(in) :: e + real(wp),intent(in) :: l + real(wp),intent(in) :: bb0 + integer,intent(in) :: imname !! which model to load (index in `mname` array) + real(wp),intent(out) :: flux + + real(wp) :: ee(1), f(1) !! temp variables + integer :: i , ierr, iuaeap , nmap + character(len=len(mname)) :: name + logical :: load_file + + name = mname(Imname) ! the file to load + + ! check to see if this file has already been loaded + ! [the class can store one file at a time] + load_file = .true. + if (allocated(me%file_loaded)) then + if (name == me%file_loaded) load_file = .false. + end if + + if (load_file) then + open (newunit = iuaeap,file=name,status='OLD',iostat=ierr,form='FORMATTED') + if ( ierr/=0 ) then + error stop 'error reading '//trim(name) + end if + read (iuaeap,'(1X,12I6)') me%ihead + nmap = me%ihead(8) + allocate(me%map(nmap)) + read (iuaeap,'(1X,12I6)') (me%map(i),i=1,nmap) + close (iuaeap) + me%file_loaded = trim(name) + end if + + ee(1) = e + call me%trara1(me%ihead,me%map,L,Bb0,ee,f,1) + flux = f(1) + IF ( Flux>0.0_wp ) Flux = 10.0_wp**Flux + + end subroutine aep8 +
Extrapolates linearly a spherical harmonic model with a + rate-of-change model.
+The coefficients (GH) of the resulting model, at date + DATE, are computed by linearly extrapolating the coef- + ficients of the base model (GH1), at date DTE1, using + those of the rate-of-change model (GH2), at date DTE2. If + one model is smaller than the other, the extrapolation is + performed with the missing coefficients assumed to be 0.
+Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +date | +
+ Date of resulting model (in decimal year) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dte1 | +
+ Date of base model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax1 | +
+ Maximum degree and order of base model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh1(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of base model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax2 | +
+ Maximum degree and order of rate-of-change model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh2(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of rate-of-change model + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +nmax | +
+ Maximum degree and order of resulting model + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +gh(*) | +
+ Coefficients of resulting model + |
+
subroutine extrashc(me,date,dte1,nmax1,gh1,nmax2,gh2,nmax,gh) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: date !! Date of resulting model (in decimal year) + real(wp),intent(in) :: dte1 !! Date of base model + integer,intent(in) :: nmax1 !! Maximum degree and order of base model + real(wp),intent(in) :: gh1(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of base model + integer,intent(in) :: nmax2 !! Maximum degree and order of rate-of-change model + real(wp),intent(in) :: gh2(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of rate-of-change model + real(wp),intent(out) :: gh(*) !! Coefficients of resulting model + integer,intent(out) :: nmax !! Maximum degree and order of resulting model + + real(wp) :: factor + integer :: i , k , l + + factor = (date-dte1) + + if ( nmax1==nmax2 ) then + k = nmax1*(nmax1+2) + nmax = nmax1 + elseif ( nmax1>nmax2 ) then + k = nmax2*(nmax2+2) + l = nmax1*(nmax1+2) + do i = k + 1 , l + gh(i) = gh1(i) + enddo + nmax = nmax1 + else + k = nmax1*(nmax1+2) + l = nmax2*(nmax2+2) + do i = k + 1 , l + gh(i) = factor*gh2(i) + enddo + nmax = nmax2 + endif + + do i = 1 , k + gh(i) = gh1(i) + factor*gh2(i) + enddo + +end subroutine extrashc +
Determines coefficients and dipol moment from IGRF models
+Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +year | +
+ decimal year for which geomagnetic field is to +be calculated (e.g.:1995.5 for day 185 of 1995) + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +dimo | +
+ geomagnetic dipol moment in gauss (normalized +to earth's radius) at the time (year) + |
+
subroutine feldcof(me,year,dimo) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: year !! decimal year for which geomagnetic field is to + !! be calculated (e.g.:1995.5 for day 185 of 1995) + real(wp),intent(out) :: dimo !! geomagnetic dipol moment in gauss (normalized + !! to earth's radius) at the time (year) + + real(wp) :: dte1 , dte2 , erad , gha(144) , sqrt2 + integer :: i , ier , j , l , m , n , nmax1 , nmax2, iyea + character(len=filename_len) :: fil2 + real(wp) :: x , f0 , f !! these were double precision in original + !! code while everything else was single precision + + ! changed to conform with IGRF 45-95, also FILMOD, DTEMOD arrays +1 + character(len=filename_len),dimension(17),parameter :: filmod = [& + 'dgrf1945.dat ' , 'dgrf1950.dat ' , 'dgrf1955.dat ' , 'dgrf1960.dat ' , & + 'dgrf1965.dat ' , 'dgrf1970.dat ' , 'dgrf1975.dat ' , 'dgrf1980.dat ' , & + 'dgrf1985.dat ' , 'dgrf1990.dat ' , 'dgrf1995.dat ' , 'dgrf2000.dat ' , & + 'dgrf2005.dat ' , 'dgrf2010.dat ' , 'dgrf2015.dat ' , 'igrf2020.dat ' , & + 'igrf2020s.dat'] + real(wp),dimension(17),parameter :: dtemod = [1945.0_wp , 1950.0_wp , 1955.0_wp , & + 1960.0_wp , 1965.0_wp , 1970.0_wp , & + 1975.0_wp , 1980.0_wp , 1985.0_wp , & + 1990.0_wp , 1995.0_wp , 2000.0_wp , & + 2005.0_wp , 2010.0_wp , 2015.0_wp , & + 2020.0_wp , 2025.0_wp] + integer,parameter :: numye = size(dtemod)-1 ! number of 5-year priods represented by IGRF + integer,parameter :: is = 0 !! * is=0 for schmidt normalization + !! * is=1 gauss normalization + + logical :: read_file + + !-- determine igrf-years for input-year + me%time = year + iyea = int(year/5.0_wp)*5 + read_file = iyea /= me%iyea ! if we have to read the file + me%iyea = iyea + l = (me%iyea-1945)/5 + 1 + if ( l<1 ) l = 1 + if ( l>numye ) l = numye + dte1 = dtemod(l) + me%name = filmod(l) + dte2 = dtemod(l+1) + fil2 = filmod(l+1) + if (read_file) then + ! get igrf coefficients for the boundary years + ! [if they have not ready been loaded] + call me%getshc(me%name,nmax1,erad,me%g,ier) + if ( ier/=0 ) error stop 'error reading file: '//trim(me%name) + call me%getshc(fil2,nmax2,erad,me%gh2,ier) + if ( ier/=0 ) error stop 'error reading file: '//trim(fil2) + end if + !-- determine igrf coefficients for year + if ( l<=numye-1 ) then + call me%intershc(year,dte1,nmax1,me%g,dte2,nmax2,me%gh2,me%nmax,gha) + else + call me%extrashc(year,dte1,nmax1,me%g,nmax2,me%gh2,me%nmax,gha) + endif + !-- determine magnetic dipol moment and coeffiecients g + f0 = 0.0_wp + do j = 1 , 3 + f = gha(j)*1.0e-5_wp + f0 = f0 + f*f + enddo + dimo = sqrt(f0) + + me%g(1) = 0.0_wp + i = 2 + f0 = 1.0e-5_wp + if ( is==0 ) f0 = -f0 + sqrt2 = sqrt(2.0_wp) + + do n = 1 , me%nmax + x = n + f0 = f0*x*x/(4.0_wp*x-2.0_wp) + if ( is==0 ) f0 = f0*(2.0_wp*x-1.0_wp)/x + f = f0*0.5_wp + if ( is==0 ) f = f*sqrt2 + me%g(i) = gha(i-1)*f0 + i = i + 1 + do m = 1 , n + f = f*(x+m)/(x-m+1.0_wp) + if ( is==0 ) f = f*sqrt((x-m+1.0_wp)/(x+m)) + me%g(i) = gha(i-1)*f + me%g(i+1) = gha(i)*f + i = i + 2 + enddo + enddo + +end subroutine feldcof +
Calculates earth magnetic field from spherical harmonics model
+ref: g. kluge, european space operations centre, internal note 61, + 1970.
+Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glat | +
+ geodetic latitude in degrees (north) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glon | +
+ geodetic longitude in degrees (east) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +alt | +
+ altitude in km above sea level + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bnorth | +
+ components of the field with respect +to the local geodetic coordinate system, with axis +pointing in the tangential plane to the north, east +and downward. + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +beast | +
+ components of the field with respect +to the local geodetic coordinate system, with axis +pointing in the tangential plane to the north, east +and downward. + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bdown | +
+ components of the field with respect +to the local geodetic coordinate system, with axis +pointing in the tangential plane to the north, east +and downward. + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +Babs | +
+ magnetic field strength in gauss + |
+
subroutine feldg(me,glat,glon,alt,bnorth,beast,bdown,babs) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: glat !! geodetic latitude in degrees (north) + real(wp),intent(in) :: glon !! geodetic longitude in degrees (east) + real(wp),intent(in) :: alt !! altitude in km above sea level + real(wp),intent(out) :: bnorth, beast, bdown !! components of the field with respect + !! to the local geodetic coordinate system, with axis + !! pointing in the tangential plane to the north, east + !! and downward. + real(wp),intent(out) :: Babs !! magnetic field strength in gauss + + real(wp) :: b(3) , brho , bxxx , & + byyy , bzzz , cp , ct , d , f , rho , & + rlat , rlon , rq , s , sp , st , t , v(3) , x , xxx , & + y , yyy , z , zzz + integer :: i , ih , ihmax , il , imax , is , k , last , m + + !-- is records entry point + ! + !*****entry point feldg to be used with geodetic co-ordinates + is=1 + rlat=glat*umr + ct=sin(rlat) + st=cos(rlat) + d=sqrt(aquad-(aquad-bquad)*ct*ct) + rlon=glon*umr + cp=cos(rlon) + sp=sin(rlon) + zzz=(alt+bquad/d)*ct/era + rho=(alt+aquad/d)*st/era + xxx=rho*cp + yyy=rho*sp + goto 10 + + !*****entry point feldc to be used with cartesian co-ordinates + ! v(3) cartesian coordinates in earth radii (6371.2 km) + ! x-axis pointing to equator at 0 longitude + ! y-axis pointing to equator at 90 long. + ! z-axis pointing to north pole + entry feldc(me,v,b) + is=2 + xxx=v(1) + yyy=v(2) + zzz=v(3) + + 10 rq=1.0_wp/(xxx*xxx+yyy*yyy+zzz*zzz) + me%xi(1)=xxx*rq + me%xi(2)=yyy*rq + me%xi(3)=zzz*rq + goto 20 + + !*****entry point feldi used for l computation + entry feldi(me) + is=3 + 20 ihmax=me%nmax*me%nmax+1 + last=ihmax+me%nmax+me%nmax + imax=me%nmax+me%nmax-1 + do i=ihmax,last + me%h(i)=me%g(i) + end do + do k=1,3,2 + i=imax + ih=ihmax + do + il=ih-i + f=2.0_wp/real(i-k+2, wp) + x=me%xi(1)*f + y=me%xi(2)*f + z=me%xi(3)*(f+f) + i=i-2 + if ((i-1)>=0) then + if ((i-1)>0) then + do m=3,i,2 + me%h(il+m+1)=me%g(il+m+1)+z*me%h(ih+m+1)+x*(me%h(ih+m+3)-& + me%h(ih+m-1))-y*(me%h(ih+m+2)+me%h(ih+m-2)) + me%h(il+m)=me%g(il+m)+z*me%h(ih+m)+x*(me%h(ih+m+2)-& + me%h(ih+m-2))+y*(me%h(ih+m+3)+me%h(ih+m-1)) + end do + end if + me%h(il+2)=me%g(il+2)+z*me%h(ih+2)+x*me%h(ih+4)-y*(me%h(ih+3)+me%h(ih)) + me%h(il+1)=me%g(il+1)+z*me%h(ih+1)+y*me%h(ih+4)+x*(me%h(ih+3)-me%h(ih)) + end if + me%h(il)=me%g(il)+z*me%h(ih)+2.0_wp*(x*me%h(ih+1)+y*me%h(ih+2)) + ih=il + if (i<k) exit + end do + end do + + if (is==3) return + + s=0.5_wp*me%h(1)+2.0_wp*(me%h(2)*me%xi(3)+me%h(3)*me%xi(1)+me%h(4)*me%xi(2)) + t=(rq+rq)*sqrt(rq) + bxxx=t*(me%h(3)-s*xxx) + byyy=t*(me%h(4)-s*yyy) + bzzz=t*(me%h(2)-s*zzz) + if (is==2) then + b(1)=bxxx + b(2)=byyy + b(3)=bzzz + else + babs=sqrt(bxxx*bxxx+byyy*byyy+bzzz*bzzz) + beast=byyy*cp-bxxx*sp + brho=byyy*sp+bxxx*cp + bnorth=bzzz*st-brho*ct + bdown=-bzzz*ct-brho*st + end if + + end subroutine feldg +
Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +stps | ++ + | +|
+ + real(kind=wp), + | +intent(inout) | ++ + | +:: | +bdel | ++ + | +|
+ + logical, + | +intent(out) | ++ + | +:: | +value | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bequ | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +rr0 | ++ + | +
subroutine findb0(me,stps,bdel,value,bequ,rr0) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: stps + real(wp),intent(inout) :: bdel + real(wp),intent(out) :: bequ + logical,intent(out) :: value + real(wp),intent(out) :: rr0 + + real(wp) :: b , bdelta , bmin , bold , bq1 , & + bq2 , bq3 , p(8,4) , r1 , r2 , r3 , & + rold , step , step12 , zz + integer :: i , irun , j , n + + step=stps + irun=0 + + main : do + irun=irun+1 + if (irun>5) then + value=.false. + exit main + endif + !*********************first three points + p(1,2)=me%sp(1) + p(2,2)=me%sp(2) + p(3,2)=me%sp(3) + step=-sign(step,p(3,2)) + call me%stoer(p(1,2),bq2,r2) + p(1,3)=p(1,2)+0.5_wp*step*p(4,2) + p(2,3)=p(2,2)+0.5_wp*step*p(5,2) + p(3,3)=p(3,2)+0.5_wp*step + call me%stoer(p(1,3),bq3,r3) + p(1,1)=p(1,2)-step*(2.0_wp*p(4,2)-p(4,3)) + p(2,1)=p(2,2)-step*(2.0_wp*p(5,2)-p(5,3)) + p(3,1)=p(3,2)-step + call me%stoer(p(1,1),bq1,r1) + p(1,3)=p(1,2)+step*(20.0_wp*p(4,3)-3.*p(4,2)+p(4,1))/18.0_wp + p(2,3)=p(2,2)+step*(20.0_wp*p(5,3)-3.*p(5,2)+p(5,1))/18.0_wp + p(3,3)=p(3,2)+step + call me%stoer(p(1,3),bq3,r3) + !******************invert sense if required + if (bq3>bq1) then + step=-step + r3=r1 + bq3=bq1 + do i=1,5 + zz=p(i,1) + p(i,1)=p(i,3) + p(i,3)=zz + end do + end if + !******************initialization + step12=step/12.0_wp + value=.true. + bmin=1.0e4_wp + bold=1.0e4_wp + !******************corrector (field line tracing) + n=0 + corrector : do + p(1,3)=p(1,2)+step12*(5.0_wp*p(4,3)+8.0_wp*p(4,2)-p(4,1)) + n=n+1 + p(2,3)=p(2,2)+step12*(5.0_wp*p(5,3)+8.0_wp*p(5,2)-p(5,1)) + !******************predictor (field line tracing) + p(1,4)=p(1,3)+step12*(23.0_wp*p(4,3)-16.0_wp*p(4,2)+5.0_wp*p(4,1)) + p(2,4)=p(2,3)+step12*(23.0_wp*p(5,3)-16.0_wp*p(5,2)+5.0_wp*p(5,1)) + p(3,4)=p(3,3)+step + call me%stoer(p(1,4),bq3,r3) + do j=1,3 + do i=1,8 + p(i,j)=p(i,j+1) + end do + end do + b=sqrt(bq3) + if (b<bmin) bmin=b + if (b>bold) exit corrector + bold=b + rold=1.0_wp/r3 + me%sp(1)=p(1,4) + me%sp(2)=p(2,4) + me%sp(3)=p(3,4) + end do corrector + if (bold/=bmin) value=.false. + bdelta=(b-bold)/bold + if (bdelta<=bdel) exit main + step=step/10.0_wp + end do main + + rr0=rold + bequ=bold + bdel=bdelta + + end subroutine findb0 +
Main routine.
+ + +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lon | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lat | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +height | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +year | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +e | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +imname | ++ + | +
function get_flux(Lon,Lat,Height,Year,E,Imname) result(flux) + + real(wp),intent(in) :: lon + real(wp),intent(in) :: lat + real(wp),intent(in) :: height + real(wp),intent(in) :: year + real(wp),intent(in) :: e + integer,intent(in) :: imname + real(wp) :: flux + + real(wp) :: xl, bbx + type(trm_type) :: trm + type(shellig_type) :: igrf + + call igrf%igrf(lon,lat,height,year,xl,bbx) + call trm%aep8(e,xl,bbx,imname,flux) + + end function get_flux +
Reads spherical harmonic coefficients from the specified + file into an array.
+Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + character(len=*), + | +intent(in) | ++ + | +:: | +Fspec | +
+ File specification + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +Nmax | +
+ Maximum degree and order of model + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +Erad | +
+ Earth's radius associated with the spherical +harmonic coefficients, in the same units as +elevation + |
+ |
+ + real(kind=wp), + | +intent(out), | ++ dimension(*) + | +:: | +Gh | +
+ Schmidt quasi-normal internal spherical +harmonic coefficients + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +Ier | +
+ Error number: +
|
+
subroutine getshc(me,Fspec,Nmax,Erad,Gh,Ier) + + class(shellig_type),intent(inout) :: me + character(len=*),intent(in) :: Fspec !! File specification + integer,intent(out) :: Nmax !! Maximum degree and order of model + real(wp),intent(out) :: Erad !! Earth's radius associated with the spherical + !! harmonic coefficients, in the same units as + !! elevation + real(wp),dimension(*),intent(out) :: Gh !! Schmidt quasi-normal internal spherical + !! harmonic coefficients + integer,intent(out) :: Ier !! Error number: + !! + !! * 0, no error + !! * -2, records out of order + !! * FORTRAN run-time error number + + integer :: iu !! logical unit number + real(wp) :: g , h + integer :: i , m , mm , n , nn + + read_file : block + ! --------------------------------------------------------------- + ! Open coefficient file. Read past first header record. + ! Read degree and order of model and Earth's radius. + ! --------------------------------------------------------------- + OPEN (newunit=Iu,FILE=Fspec,STATUS='OLD',IOSTAT=Ier) + if (Ier/=0) then + write(*,*) 'Error opening file: '//trim(fspec) + exit read_file + end if + READ (Iu,*,IOSTAT=Ier) + if (Ier/=0) exit read_file + READ (Iu,*,IOSTAT=Ier) Nmax , Erad + if (Ier/=0) exit read_file + + ! --------------------------------------------------------------- + ! Read the coefficient file, arranged as follows: + ! + ! N M G H + ! ---------------------- + ! / 1 0 GH(1) - + ! / 1 1 GH(2) GH(3) + ! / 2 0 GH(4) - + ! / 2 1 GH(5) GH(6) + ! NMAX*(NMAX+3)/2 / 2 2 GH(7) GH(8) + ! records \ 3 0 GH(9) - + ! \ . . . . + ! \ . . . . + ! NMAX*(NMAX+2) \ . . . . + ! elements in GH \ NMAX NMAX . . + ! + ! N and M are, respectively, the degree and order of the + ! coefficient. + ! --------------------------------------------------------------- + i = 0 + main: DO nn = 1 , Nmax + DO mm = 0 , nn + READ (Iu,*,IOSTAT=Ier) n , m , g , h + if (Ier/=0) exit main + IF ( nn/=n .OR. mm/=m ) THEN + Ier = -2 + EXIT main + ENDIF + i = i + 1 + Gh(i) = g + IF ( m/=0 ) THEN + i = i + 1 + Gh(i) = h + ENDIF + ENDDO + ENDDO main + + end block read_file + + CLOSE (Iu) + +END subroutine getshc +
Wrapper for IGRF functions.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lon | +
+ geodetic longitude in degrees (east) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +lat | +
+ geodetic latitude in degrees (north) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +height | +
+ altitude in km above sea level + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +year | +
+ decimal year for which geomagnetic field is to +be calculated (e.g.:1995.5 for day 185 of 1995) + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +xl | +
+ l-value + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bbx | ++ + | +
subroutine igrf(me,lon,lat,height,year,xl,bbx) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: lon !! geodetic longitude in degrees (east) + real(wp),intent(in) :: lat !! geodetic latitude in degrees (north) + real(wp),intent(in) :: height !! altitude in km above sea level + real(wp),intent(in) :: year !! decimal year for which geomagnetic field is to + !! be calculated (e.g.:1995.5 for day 185 of 1995) + real(wp),intent(out) :: xl !! l-value + real(wp),intent(out) :: bbx + + real(wp) :: bab1 , babs , bdel , bdown , beast , & + beq , bequ , bnorth , dimo , rr0 + integer :: icode + logical :: val + + real(wp),parameter :: stps = 0.05_wp + + call me%feldcof(year,dimo) + call me%feldg(lat,lon,height,bnorth,beast,bdown,babs) + call me%shellg(lat,lon,height,dimo,xl,icode,bab1) + + bequ = dimo/(xl*xl*xl) + if ( icode==1 ) then + bdel = 1.0e-3_wp + call me%findb0(stps,bdel,val,beq,rr0) + if ( val ) bequ = beq + endif + bbx = babs/bequ + + end subroutine igrf +
Interpolates linearly, in time, between two spherical + harmonic models.
+The coefficients (GH) of the resulting model, at date + DATE, are computed by linearly interpolating between the + coefficients of the earlier model (GH1), at date DTE1, + and those of the later model (GH2), at date DTE2. If one + model is smaller than the other, the interpolation is + performed with the missing coefficients assumed to be 0.
+Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +date | +
+ Date of resulting model (in decimal year) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dte1 | +
+ Date of earlier model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax1 | +
+ Maximum degree and order of earlier model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh1(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of earlier model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dte2 | +
+ Date of later model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +nmax2 | +
+ Maximum degree and order of later model + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +gh2(*) | +
+ Schmidt quasi-normal internal spherical harmonic coefficients of later model + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +nmax | +
+ Maximum degree and order of resulting model + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +gh(*) | +
+ Coefficients of resulting model + |
+
subroutine intershc(me,date,dte1,nmax1,gh1,dte2,nmax2,gh2,nmax,gh) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: date !! Date of resulting model (in decimal year) + real(wp),intent(in) :: dte1 !! Date of earlier model + integer,intent(in) :: nmax1 !! Maximum degree and order of earlier model + real(wp),intent(in) :: gh1(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of earlier model + real(wp),intent(in) :: dte2 !! Date of later model + integer,intent(in) :: nmax2 !! Maximum degree and order of later model + real(wp),intent(in) :: gh2(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of later model + real(wp),intent(out) :: gh(*) !! Coefficients of resulting model + integer,intent(out) :: nmax !! Maximum degree and order of resulting model + + real(wp) :: factor + integer :: i , k , l + + factor = (date-dte1)/(dte2-dte1) + + if ( nmax1==nmax2 ) then + k = nmax1*(nmax1+2) + nmax = nmax1 + elseif ( nmax1>nmax2 ) then + k = nmax2*(nmax2+2) + l = nmax1*(nmax1+2) + do i = k + 1 , l + gh(i) = gh1(i) + factor*(-gh1(i)) + enddo + nmax = nmax1 + else + k = nmax1*(nmax1+2) + l = nmax2*(nmax2+2) + do i = k + 1 , l + gh(i) = factor*gh2(i) + enddo + nmax = nmax2 + endif + + do i = 1 , k + gh(i) = gh1(i) + factor*(gh2(i)-gh1(i)) + enddo + +end subroutine intershc +
calculates l-value for specified geodaetic coordinates, altitude + and gemagnetic field model.
+Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glat | +
+ GEODETIC LATITUDE IN DEGREES (NORTH) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +glon | +
+ GEODETIC LONGITUDE IN DEGREES (EAST) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +alt | +
+ ALTITUDE IN KM ABOVE SEA LEVEL + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +dimo | +
+ DIPOL MOMENT IN GAUSS (NORMALIZED TO EARTH RADIUS) + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +fl | +
+ l-value + |
+ |
+ + integer, + | +intent(out) | ++ + | +:: | +icode | +
+
|
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +b0 | +
+ magnetic field strength in gauss + |
+
subroutine shellg(me,glat,glon,alt,dimo,fl,icode,b0) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: glat !! GEODETIC LATITUDE IN DEGREES (NORTH) + real(wp),intent(in) :: glon !! GEODETIC LONGITUDE IN DEGREES (EAST) + real(wp),intent(in) :: alt !! ALTITUDE IN KM ABOVE SEA LEVEL + real(wp),intent(in) :: dimo !! DIPOL MOMENT IN GAUSS (NORMALIZED TO EARTH RADIUS) + real(wp),intent(out) :: fl !! l-value + integer,intent(out) :: icode !! * =1 normal completion + !! * =2 unphysical conjugate point (fl meaningless) + !! * =3 shell parameter greater than limit up to + !! which accurate calculation is required; + !! approximation is used. + real(wp),intent(out) :: b0 !! magnetic field strength in gauss + + real(wp) :: arg1 , arg2 , bequ , bq1 , bq2 , bq3 , c0 , c1 , c2 , c3 , & + ct , d , d0 , d1 , d2, dimob0 , e0 , e1 , e2 , ff , fi , gg , & + hli , oradik , oterm , p(8,100) , r , r1 , r2 , r3 , r3h , radik , & + rlat , rlon , rq , st , step12 , step2 , & + stp , t , term , v(3) , xx , z , zq , zz + integer :: i , iequ , n + + real(wp),parameter :: rmin = 0.05_wp !! boundaries for identification of `icode=2 and 3` + real(wp),parameter :: rmax = 1.01_wp !! boundaries for identification of `icode=2 and 3` + + bequ = 1.0e10_wp + + !*****ENTRY POINT SHELLG TO BE USED WITH GEODETIC CO-ORDINATES + rlat = Glat*Umr + ct = sin(rlat) + st = cos(rlat) + d = sqrt(Aquad-(Aquad-Bquad)*ct*ct) + me%Xi(1) = (Alt+Aquad/d)*st/Era + me%Xi(3) = (Alt+Bquad/d)*ct/Era + rlon = Glon*Umr + me%Xi(2) = me%Xi(1)*sin(rlon) + me%Xi(1) = me%Xi(1)*cos(rlon) + CALL spag_block_1() + RETURN + +!*****ENTRY POINT SHELLC TO BE USED WITH CARTESIAN CO-ORDINATES ! JW : does not appear to be used anywhere. +! V(3) CARTESIAN COORDINATES IN EARTH RADII (6371.2 KM) +! X-AXIS POINTING TO EQUATOR AT 0 LONGITUDE +! Y-AXIS POINTING TO EQUATOR AT 90 LONG. +! Z-AXIS POINTING TO NORTH POLE + ENTRY shellc(me,V,Fl,B0) + me%Xi(1) = V(1) + me%Xi(2) = V(2) + me%Xi(3) = V(3) + CALL spag_block_1() + +CONTAINS + + subroutine spag_block_1 + + integer,parameter :: max_loop_index = 100 ! 3333 <--- JW : original code had 3333 ... was this a bug ???? + + !*****CONVERT TO DIPOL-ORIENTED CO-ORDINATES + rq = 1.0_wp/(me%Xi(1)*me%Xi(1)+me%Xi(2)*me%Xi(2)+me%Xi(3)*me%Xi(3)) + r3h = sqrt(rq*sqrt(rq)) + p(1,2) = (me%Xi(1)*u(1,1)+me%Xi(2)*u(2,1)+me%Xi(3)*u(3,1))*r3h + p(2,2) = (me%Xi(1)*u(1,2)+me%Xi(2)*u(2,2))*r3h + p(3,2) = (me%Xi(1)*u(1,3)+me%Xi(2)*u(2,3)+me%Xi(3)*u(3,3))*rq + ! *****FIRST THREE POINTS OF FIELD LINE + me%step = -sign(me%step,p(3,2)) + call me%stoer(p(1,2),bq2,r2) + B0 = sqrt(bq2) + p(1,3) = p(1,2) + 0.5_wp*me%step*p(4,2) + p(2,3) = p(2,2) + 0.5_wp*me%step*p(5,2) + p(3,3) = p(3,2) + 0.5_wp*me%step + call me%stoer(p(1,3),bq3,r3) + p(1,1) = p(1,2) - me%step*(2.0_wp*p(4,2)-p(4,3)) + p(2,1) = p(2,2) - me%step*(2.0_wp*p(5,2)-p(5,3)) + p(3,1) = p(3,2) - me%step + call me%stoer(p(1,1),bq1,r1) + p(1,3) = p(1,2) + me%step*(20.0_wp*p(4,3)-3.*p(4,2)+p(4,1))/18.0_wp + p(2,3) = p(2,2) + me%step*(20.0_wp*p(5,3)-3.*p(5,2)+p(5,1))/18.0_wp + p(3,3) = p(3,2) + me%step + call me%stoer(p(1,3),bq3,r3) + !*****INVERT SENSE IF REQUIRED + IF ( bq3>bq1 ) THEN + me%step = -me%step + r3 = r1 + bq3 = bq1 + DO i = 1 , 7 + zz = p(i,1) + p(i,1) = p(i,3) + p(i,3) = zz + ENDDO + ENDIF + !*****SEARCH FOR LOWEST MAGNETIC FIELD STRENGTH + IF ( bq1<bequ ) THEN + bequ = bq1 + iequ = 1 + ENDIF + IF ( bq2<bequ ) THEN + bequ = bq2 + iequ = 2 + ENDIF + IF ( bq3<bequ ) THEN + bequ = bq3 + iequ = 3 + ENDIF + !*****INITIALIZATION OF INTEGRATION LOOPS + step12 = me%step/12.0_wp + step2 = me%step + me%step + me%steq = sign(me%steq,me%step) + fi = 0.0_wp + Icode = 1 + oradik = 0.0_wp + oterm = 0.0_wp + stp = r2*me%steq + z = p(3,2) + stp + stp = stp/0.75_wp + p(8,1) = step2*(p(1,1)*p(4,1)+p(2,1)*p(5,1)) + p(8,2) = step2*(p(1,2)*p(4,2)+p(2,2)*p(5,2)) + !*****MAIN LOOP (FIELD LINE TRACING) + main: DO n = 3 , max_loop_index + !*****CORRECTOR (FIELD LINE TRACING) + p(1,n) = p(1,n-1) + step12*(5.0_wp*p(4,n)+8.0_wp*p(4,n-1)-p(4,n-2)) + p(2,n) = p(2,n-1) + step12*(5.0_wp*p(5,n)+8.0_wp*p(5,n-1)-p(5,n-2)) + !*****PREPARE EXPANSION COEFFICIENTS FOR INTERPOLATION + !*****OF SLOWLY VARYING QUANTITIES + p(8,n) = step2*(p(1,n)*p(4,n)+p(2,n)*p(5,n)) + c0 = p(1,n-1)**2 + p(2,n-1)**2 + c1 = p(8,n-1) + c2 = (p(8,n)-p(8,n-2))*0.25_wp + c3 = (p(8,n)+p(8,n-2)-c1-c1)/6.0_wp + d0 = p(6,n-1) + d1 = (p(6,n)-p(6,n-2))*0.5_wp + d2 = (p(6,n)+p(6,n-2)-d0-d0)*0.5_wp + e0 = p(7,n-1) + e1 = (p(7,n)-p(7,n-2))*0.5_wp + e2 = (p(7,n)+p(7,n-2)-e0-e0)*0.5_wp + inner: DO + !*****INNER LOOP (FOR QUADRATURE) + t = (z-p(3,n-1))/me%step + IF ( t>1.0_wp ) THEN + !*****PREDICTOR (FIELD LINE TRACING) + p(1,n+1) = p(1,n) + step12*(23.0_wp*p(4,n)-16.0_wp*p(4,n-1)+5.0_wp*p(4,n-2)) + p(2,n+1) = p(2,n) + step12*(23.0_wp*p(5,n)-16.0_wp*p(5,n-1)+5.0_wp*p(5,n-2)) + p(3,n+1) = p(3,n) + me%step + call me%stoer(p(1,n+1),bq3,r3) + !*****SEARCH FOR LOWEST MAGNETIC FIELD STRENGTH + IF ( bq3<bequ ) THEN + iequ = n + 1 + bequ = bq3 + ENDIF + EXIT inner + ELSE + hli = 0.5_wp*(((c3*t+c2)*t+c1)*t+c0) + zq = z*z + r = hli + sqrt(hli*hli+zq) + IF ( r<=rmin ) THEN + !*****APPROXIMATION FOR HIGH VALUES OF L. + Icode = 3 + t = -p(3,n-1)/me%step + Fl = 1.0_wp/(abs(((c3*t+c2)*t+c1)*t+c0)+1.0e-15_wp) + RETURN + ENDIF + rq = r*r + ff = sqrt(1.0_wp+3.0_wp*zq/rq) + radik = B0 - ((d2*t+d1)*t+d0)*r*rq*ff + IF ( r>rmax ) THEN + Icode = 2 + radik = radik - 12.0_wp*(r-rmax)**2 + ENDIF + IF ( radik+radik<=oradik ) EXIT main + term = sqrt(radik)*ff*((e2*t+e1)*t+e0)/(rq+zq) + fi = fi + stp*(oterm+term) + oradik = radik + oterm = term + stp = r*me%steq + z = z + stp + ENDIF + ENDDO inner + ENDDO main + IF ( iequ<2 ) iequ = 2 + me%Sp(1) = p(1,iequ-1) + me%Sp(2) = p(2,iequ-1) + me%Sp(3) = p(3,iequ-1) + IF ( oradik>=1.0e-15_wp ) fi = fi + stp/0.75_wp*oterm*oradik/(oradik-radik) + ! + !-- The minimal allowable value of FI was changed from 1E-15 to 1E-12, + !-- because 1E-38 is the minimal allowable arg. for ALOG in our envir. + !-- D. Bilitza, Nov 87. + ! + fi = 0.5_wp*abs(fi)/sqrt(B0) + 1.0e-12_wp + !*****COMPUTE L FROM B AND I. SAME AS CARMEL IN INVAR. + ! + !-- Correct dipole moment is used here. D. Bilitza, Nov 87. + ! + dimob0 = Dimo/B0 + arg1 = log(fi) + arg2 = log(dimob0) +! arg = FI*FI*FI/DIMOB0 +! if(abs(arg)>88.0_wp) arg=88.0_wp + xx = 3*arg1 - arg2 + IF ( xx>23.0_wp ) THEN + gg = xx - 3.0460681_wp + ELSEIF ( xx>11.7_wp ) THEN + gg = (((((2.8212095E-8_wp*xx-3.8049276E-6_wp)*xx+& + 2.170224E-4_wp)*xx-6.7310339E-3_wp)*xx+& + 1.2038224E-1_wp)*xx-1.8461796E-1_wp)*xx + 2.0007187_wp + ELSEIF ( xx>+3.0_wp ) THEN + gg = ((((((((6.3271665E-10_wp*xx-3.958306E-8_wp)*xx+& + 9.9766148E-07_wp)*xx-1.2531932E-5_wp)*xx+& + 7.9451313E-5_wp)*xx-3.2077032E-4_wp)*xx+& + 2.1680398E-3_wp)*xx+1.2817956E-2_wp)*xx+& + 4.3510529E-1_wp)*xx + 6.222355E-1_wp + ELSEIF ( xx>-3.0_wp ) THEN + gg = ((((((((2.6047023E-10_wp*xx+2.3028767E-9_wp)*xx-& + 2.1997983E-8_wp)*xx-5.3977642E-7_wp)*xx-& + 3.3408822E-6_wp)*xx+3.8379917E-5_wp)*xx+& + 1.1784234E-3_wp)*xx+1.4492441E-2_wp)*xx+& + 4.3352788E-1_wp)*xx + 6.228644E-1_wp + ELSEIF ( xx>-22.0_wp ) THEN + gg = ((((((((-8.1537735E-14_wp*xx+8.3232531E-13_wp)*xx+& + 1.0066362E-9_wp)*xx+8.1048663E-8_wp)*xx+& + 3.2916354E-6_wp)*xx+8.2711096E-5_wp)*xx+& + 1.3714667E-3_wp)*xx+1.5017245E-2_wp)*xx+& + 4.3432642E-1_wp)*xx + 6.2337691E-1_wp + ELSE + gg = 3.33338E-1_wp*xx + 3.0062102E-1_wp + ENDIF + Fl = exp(log((1.0_wp+exp(gg))*dimob0)/3.0_wp) + RETURN + END subroutine spag_block_1 + +END subroutine shellg +
subroutine used for field line tracing in shellg +calls entry point feldi in geomagnetic field subroutine feldg
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(shellig_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + real(kind=wp), + | +intent(inout), | ++ dimension(7) + | +:: | +p | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +bq | ++ + | +|
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +r | ++ + | +
subroutine stoer(me,p,bq,r) + + class(shellig_type),intent(inout) :: me + real(wp),dimension(7),intent(inout) :: p + real(wp),intent(out) :: bq + real(wp),intent(out) :: r + + real(wp) :: dr , dsq , dx , dxm , dy , dym , dz , & + dzm , fli , q , rq , wr , xm , ym , zm + +!*****XM,YM,ZM ARE GEOMAGNETIC CARTESIAN INVERSE CO-ORDINATES + zm = P(3) + fli = P(1)*P(1) + P(2)*P(2) + 1.0e-15_wp + R = 0.5_wp*(fli+sqrt(fli*fli+(zm+zm)**2)) + rq = R*R + wr = sqrt(R) + xm = P(1)*wr + ym = P(2)*wr +!*****TRANSFORM TO GEOGRAPHIC CO-ORDINATE SYSTEM + me%Xi(1) = xm*u(1,1) + ym*u(1,2) + zm*u(1,3) + me%Xi(2) = xm*u(2,1) + ym*u(2,2) + zm*u(2,3) + me%Xi(3) = xm*u(3,1) + zm*u(3,3) +!*****COMPUTE DERIVATIVES +! Changed from CALL FELDI(XI,H); XI, H are in COMMON block; results +! are the same; dkb Feb 1998. +! JW : feb 2024 : xi, h now class variables. + CALL feldi(me) + q = me%H(1)/rq + dx = me%H(3) + me%H(3) + q*me%Xi(1) + dy = me%H(4) + me%H(4) + q*me%Xi(2) + dz = me%H(2) + me%H(2) + q*me%Xi(3) +!*****TRANSFORM BACK TO GEOMAGNETIC CO-ORDINATE SYSTEM + dxm = u(1,1)*dx + u(2,1)*dy + u(3,1)*dz + dym = u(1,2)*dx + u(2,2)*dy + dzm = u(1,3)*dx + u(2,3)*dy + u(3,3)*dz + dr = (xm*dxm+ym*dym+zm*dzm)/R +!*****FORM SLOWLY VARYING EXPRESSIONS + P(4) = (wr*dxm-0.5_wp*P(1)*dr)/(R*dzm) + P(5) = (wr*dym-0.5_wp*P(2)*dr)/(R*dzm) + dsq = rq*(dxm*dxm+dym*dym+dzm*dzm) + Bq = dsq*rq*rq + P(6) = sqrt(dsq/(rq+3.0_wp*zm*zm)) + P(7) = P(6)*(rq+zm*zm)/(rq*dzm) +END subroutine stoer +
trara1 finds particle fluxes for given energies, magnetic field +strength and l-value. function trara2 is used to interpolate in +b-l-space.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(trm_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +descr(8) | +
+ header of specified trapped radition model + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +map(*) | +
+ map of trapped radition model +(descr and map are explained at the begin +of the main program model) + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +fl | +
+ l-value + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +bb0 | +
+ =b/b0 magnetic field strength normalized +to field strength at magnetic equator + |
+ |
+ + real(kind=wp), + | +intent(in) | ++ + | +:: | +e(n) | +
+ array of energies in mev + |
+ |
+ + real(kind=wp), + | +intent(out) | ++ + | +:: | +f(n) | +
+ decadic logarithm of integral fluxes in +particles/(cmcmsec) + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +n | +
+ number of energies + |
+
subroutine trara1(me,descr,map,fl,bb0,e,f,n) + + class(trm_type),intent(inout) :: me + integer,intent(in) :: n !! number of energies + integer,intent(in) :: descr(8) !! header of specified trapped radition model + real(wp),intent(in) :: e(n) !! array of energies in mev + real(wp),intent(in) :: fl !! l-value + real(wp),intent(in) :: bb0 !! =b/b0 magnetic field strength normalized + !! to field strength at magnetic equator + integer,intent(in) :: map(*) !! map of trapped radition model + !! (descr and map are explained at the begin + !! of the main program model) + real(wp),intent(out) :: f(n) !! decadic logarithm of integral fluxes in + !! particles/(cm*cm*sec) + + real(wp) :: e0 , e1 , e2 , escale , f0 , fscale , xnl + real(wp) :: bb0_ !! local copy of `bb0`. in the original code + !! this was modified by this routine. + !! added this so `bb0` could be `intent(in)` + integer :: i0 , i1 , i2 , i3 , ie , l3 , nb , nl + logical :: s0 , s1 , s2 + + bb0_ = bb0 + me%fistep = descr(7)/descr(2) + escale = descr(4) + fscale = descr(7) + xnl = min(15.6_wp,abs(fl)) + nl = xnl*descr(5) + if ( bb0_<1.0_wp ) bb0_ = 1.0_wp + nb = (bb0_-1.0_wp)*descr(6) + + ! i2 is the number of elements in the flux map for the first energy. + ! i3 is the index of the last element of the second energy map. + ! l3 is the length of the map for the third energy. + ! e1 is the energy of the first energy map (unscaled) + ! e2 is the energy of the second energy map (unscaled) + i1 = 0 + i2 = map(1) + i3 = i2 + map(i2+1) + l3 = map(i3+1) + e1 = map(i1+2)/escale + e2 = map(i2+2)/escale + + ! s0, s1, s2 are logical variables which indicate whether the flux for + ! a particular e, b, l point has already been found in a previous call + ! to function trara2. if not, s.. =.true. + s1 = .true. + s2 = .true. + + ! energy loop + + do ie = 1 , n + + ! for each energy e(i) find the successive energies e0,e1,e2 in + ! model map, which obey e0 < e1 < e(i) < e2 . + + do while ( (e(ie)>e2) .and. (l3/=0) ) + i0 = i1 + i1 = i2 + i2 = i3 + i3 = i3 + l3 + l3 = map(i3+1) + e0 = e1 + e1 = e2 + e2 = map(i2+2)/escale + s0 = s1 + s1 = s2 + s2 = .true. + f0 = me%f1 + me%f1 = me%f2 + enddo + + ! call trara2 to interpolate the flux-maps for e1,e2 in l-b/b0- + ! space to find fluxes f1,f2 [if they have not already been + ! calculated for a previous e(i)]. + + if ( s1 ) me%f1 = me%trara2(map(i1+3),nl,nb)/fscale + if ( s2 ) me%f2 = me%trara2(map(i2+3),nl,nb)/fscale + s1 = .false. + s2 = .false. + + ! finally, interpolate in energy. + + f(ie) = me%f1 + (me%f2-me%f1)*(e(ie)-e1)/(e2-e1) + if ( me%f2<=0.0_wp ) then + if ( i1/=0 ) then + ! --------- special interpolation --------------------------------- + ! if the flux for the second energy cannot be found (i.e. f2=0.0), + ! and the zeroth energy map has been defined (i.e. i1 not equal 0), + ! then interpolate using the flux maps for the zeroth and first + ! energy and choose the minimum of this interpolations and the + ! interpolation that was done with f2=0. + if ( s0 ) f0 = me%trara2(map(i0+3),nl,nb)/fscale + s0 = .false. + f(ie) = min(f(ie),f0+(me%f1-f0)*(e(ie)-e0)/(e1-e0)) + endif + endif + + ! the logarithmic flux is always kept greater or equal zero. + + f(ie) = max(f(ie),0.0_wp) + enddo +end subroutine trara1 +
trara2 interpolates linearly in l-b/b0-map to obtain + the logarithm of integral flux at given l and b/b0.
+see main program 'model' for explanation of map format + scaling factors.
+ +Type | +Intent | Optional | Attributes | ++ | Name | ++ |
---|---|---|---|---|---|---|
+ + class(trm_type), + | +intent(inout) | ++ + | +:: | +me | ++ + | +|
+ + integer, + | +intent(in) | ++ + | +:: | +map(*) | +
+ is sub-map (for specific energy) of +trapped radiation model map + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +il | +
+ scaled l-value + |
+ |
+ + integer, + | +intent(in) | ++ + | +:: | +ib | +
+ scaled b/b0-1 + |
+
scaled logarithm of particle flux
+function trara2(me,map,il,ib) + + class(trm_type),intent(inout) :: me + integer,intent(in) :: map(*) !! is sub-map (for specific energy) of + !! trapped radiation model map + integer,intent(in) :: il !! scaled l-value + integer,intent(in) :: ib !! scaled b/b0-1 + real(wp) :: trara2 !! scaled logarithm of particle flux + + real(wp) :: dfl , fincr1 , fincr2 , fistep , fkb , fkb1 , fkb2 , fkbj1 , fkbj2 , & + fkbm , fll1 , fll2 , flog , flog1 , flog2 , flogm , & + fnb , fnl , sl1 , sl2 + integer :: i1 , i2 , itime , j1 , j2 , kt , l1 , l2 + + integer :: spag_nextblock_1 + + fistep = me%fistep + + spag_nextblock_1 = 1 + main: do + select case (spag_nextblock_1) + case (1) + fnl = il + fnb = ib + itime = 0 + i2 = 0 + do + + ! find consecutive sub-sub-maps for scaled l-values ls1,ls2, + ! with il less or equal ls2. l1,l2 are lengths of sub-sub-maps. + ! i1,i2 are indeces of first elements minus 1. + + l2 = map(i2+1) + if ( map(i2+2)<=il ) then + i1 = i2 + l1 = l2 + i2 = i2 + l2 + + ! if sub-sub-maps are empty, i. e. length less 4, than trara2=0 + + elseif ( (l1<4) .and. (l2<4) ) then + trara2 = 0.0_wp + return + else + + ! if flog2 less flog1, than ls2 first map and ls1 second map + + if ( map(i2+3)<=map(i1+3) ) exit + spag_nextblock_1 = 3 + cycle main + endif + enddo + spag_nextblock_1 = 2 + case (2) + kt = i1 + i1 = i2 + i2 = kt + kt = l1 + l1 = l2 + l2 = kt + spag_nextblock_1 = 3 + case (3) + + ! determine interpolate in scaled l-value + + fll1 = map(i1+2) + fll2 = map(i2+2) + dfl = (fnl-fll1)/(fll2-fll1) + flog1 = map(i1+3) + flog2 = map(i2+3) + fkb1 = 0.0_wp + fkb2 = 0.0_wp + if ( l1>=4 ) then + + ! b/b0 loop + + do j2 = 4 , l2 + fincr2 = map(i2+j2) + if ( fkb2+fincr2>fnb ) goto 10 + fkb2 = fkb2 + fincr2 + flog2 = flog2 - fistep + enddo + itime = itime + 1 + if ( itime==1 ) then + spag_nextblock_1 = 2 + cycle main + endif + trara2 = 0.0_wp + return + 10 if ( itime/=1 ) then + if ( j2==4 ) then + spag_nextblock_1 = 4 + cycle main + endif + sl2 = flog2/fkb2 + do j1 = 4 , l1 + fincr1 = map(i1+j1) + fkb1 = fkb1 + fincr1 + flog1 = flog1 - fistep + fkbj1 = ((flog1/fistep)*fincr1+fkb1)/((fincr1/fistep)*sl2+1.0_wp) + if ( fkbj1<=fkb1 ) goto 15 + enddo + if ( fkbj1<=fkb2 ) then + trara2 = 0.0_wp + return + endif + 15 if ( fkbj1<=fkb2 ) then + fkbm = fkbj1 + (fkb2-fkbj1)*dfl + flogm = fkbm*sl2 + flog2 = flog2 - fistep + fkb2 = fkb2 + fincr2 + sl1 = flog1/fkb1 + sl2 = flog2/fkb2 + spag_nextblock_1 = 5 + cycle main + else + fkb1 = 0.0_wp + endif + endif + fkb2 = 0.0_wp + endif + j2 = 4 + fincr2 = map(i2+j2) + flog2 = map(i2+3) + flog1 = map(i1+3) + spag_nextblock_1 = 4 + case (4) + flogm = flog1 + (flog2-flog1)*dfl + fkbm = 0.0_wp + fkb2 = fkb2 + fincr2 + flog2 = flog2 - fistep + sl2 = flog2/fkb2 + if ( l1<4 ) then + fincr1 = 0.0_wp + sl1 = -900000.0_wp + spag_nextblock_1 = 6 + cycle main + else + j1 = 4 + fincr1 = map(i1+j1) + fkb1 = fkb1 + fincr1 + flog1 = flog1 - fistep + sl1 = flog1/fkb1 + endif + spag_nextblock_1 = 5 + case (5) + do while ( sl1>=sl2 ) + fkbj2 = ((flog2/fistep)*fincr2+fkb2)/((fincr2/fistep)*sl1+1.0_wp) + fkb = fkb1 + (fkbj2-fkb1)*dfl + flog = fkb*sl1 + if ( fkb>=fnb ) then + spag_nextblock_1 = 7 + cycle main + endif + fkbm = fkb + flogm = flog + if ( j1>=l1 ) then + trara2 = 0.0_wp + return + else + j1 = j1 + 1 + fincr1 = map(i1+j1) + flog1 = flog1 - fistep + fkb1 = fkb1 + fincr1 + sl1 = flog1/fkb1 + endif + enddo + spag_nextblock_1 = 6 + case (6) + fkbj1 = ((flog1/fistep)*fincr1+fkb1)/((fincr1/fistep)*sl2+1.0_wp) + fkb = fkbj1 + (fkb2-fkbj1)*dfl + flog = fkb*sl2 + if ( fkb<fnb ) then + fkbm = fkb + flogm = flog + if ( j2>=l2 ) then + trara2 = 0.0_wp + return + else + j2 = j2 + 1 + fincr2 = map(i2+j2) + flog2 = flog2 - fistep + fkb2 = fkb2 + fincr2 + sl2 = flog2/fkb2 + spag_nextblock_1 = 5 + cycle main + endif + endif + spag_nextblock_1 = 7 + case (7) + if ( fkb<fkbm+1.0e-10_wp ) then + trara2 = 0.0_wp + else + trara2 = flogm + (flog-flogm)*((fnb-fkbm)/(fkb-fkbm)) + trara2 = max(trara2,0.0_wp) + return + endif + exit main + end select + enddo main + +end function trara2 +
!***************************************************************************************** +!> +! Main module. +! +!### See also +! * https://ccmc.gsfc.nasa.gov/pub/modelweb/geomagnetic/igrf/fortran_code/bilcal.for +! * https://ccmc.gsfc.nasa.gov/pub/modelweb/radiation_belt/radbelt/fortran_code/radbelt.for + +module core + + use radbelt_kinds_module + use trmfun_module + use shellig_module + + implicit none + + public :: get_flux + + contains + +!***************************************************************************************** +!> +! Main routine. + + function get_flux(Lon,Lat,Height,Year,E,Imname) result(flux) + + real(wp),intent(in) :: lon + real(wp),intent(in) :: lat + real(wp),intent(in) :: height + real(wp),intent(in) :: year + real(wp),intent(in) :: e + integer,intent(in) :: imname + real(wp) :: flux + + real(wp) :: xl, bbx + type(trm_type) :: trm + type(shellig_type) :: igrf + + call igrf%igrf(lon,lat,height,year,xl,bbx) + call trm%aep8(e,xl,bbx,imname,flux) + + end function get_flux +!***************************************************************************************** + +end module core +
!***************************************************************************************** +!> +! Numeric kind definitions for radbelt. + + module radbelt_kinds_module + + use,intrinsic :: iso_fortran_env + + implicit none + + private + +#ifdef REAL32 + integer,parameter,public :: wp = real32 !! Real working precision [4 bytes] +#elif REAL64 + integer,parameter,public :: wp = real64 !! Real working precision [8 bytes] +#elif REAL128 + integer,parameter,public :: wp = real128 !! Real working precision [16 bytes] +#else + integer,parameter,public :: wp = real64 !! Real working precision if not specified [8 bytes] +#endif + +#ifdef INT8 + integer,parameter,public :: ip = int8 !! Integer working precision [1 byte] +#elif INT16 + integer,parameter,public :: ip = int16 !! Integer working precision [2 bytes] +#elif INT32 + integer,parameter,public :: ip = int32 !! Integer working precision [4 bytes] +#elif INT64 + integer,parameter,public :: ip = int64 !! Integer working precision [8 bytes] +#else + integer,parameter,public :: ip = int32 !! Integer working precision if not specified [4 bytes] +#endif + +!***************************************************************************************** + end module radbelt_kinds_module +!***************************************************************************************** +
!***************************************************************************************** +!> +! IGRF model +! +!### History +! * SHELLIG.FOR, Version 2.0, January 1992 +! * 11/01/91-DKB- SHELLG: lowest starting point for B0 search is 2 +! * 1/27/92-DKB- Adopted to IGRF-91 coefficients model +! * 2/05/92-DKB- Reduce variable-names: INTER(P)SHC,EXTRA(P)SHC,INITI(ALI)ZE +! * 8/08/95-DKB- Updated to IGRF-45-95; new coeff. DGRF90, IGRF95, IGRF95S +! * 5/31/00-DKB- Updated to IGRF-45-00; new coeff.: IGRF00, IGRF00s +! * 3/24/05-DKB- Updated to IGRF-45-10; new coeff.: IGRF05, IGRF05s + + module shellig_module + + use radbelt_kinds_module + + implicit none + + private + + integer,parameter :: filename_len = 14 !! length of the model data file names + + ! parameters formerly in `gener` common block + real(wp),parameter :: Era = 6371.2_wp !! earth radius for normalization of cartesian coordinates (6371.2 km) + real(wp),parameter :: erequ = 6378.16_wp + real(wp),parameter :: erpol = 6356.775_wp + real(wp),parameter :: Aquad = erequ*erequ !! square of major half axis for + !! earth ellipsoid as recommended by international + !! astronomical union + real(wp),parameter :: Bquad = erpol*erpol !! square of minor half axis for + !! earth ellipsoid as recommended by international + !! astronomical union + real(wp),parameter :: Umr = atan(1.0_wp)*4.0_wp/180.0_wp !! atan(1.0)*4./180. <degree>*umr=<radiant> + + real(wp),dimension(3,3),parameter :: u = reshape([ +0.3511737_wp , -0.9148385_wp , -0.1993679_wp , & + +0.9335804_wp , +0.3583680_wp , +0.0000000_wp , & + +0.0714471_wp , -0.1861260_wp , +0.9799247_wp], [3,3]) + + type,public :: shellig_type + private + + ! formerly in the `fidb0` common block + real(wp),dimension(3) :: sp = 0.0_wp + + ! formerly in blank common + real(wp),dimension(3) :: xi = 0.0_wp + real(wp),dimension(144) :: h = 0.0_wp !! Field model coefficients adjusted for [[shellg]] + + ! formerly in `model` common block + integer :: iyea = 0 !! the int year corresponding to the file `name` that has been read + character(len=filename_len) :: name = '' !! file name + integer :: nmax = 0 !! maximum order of spherical harmonics + real(wp) :: Time = 0.0_wp !! year (decimal: 1973.5) for which magnetic field is to be calculated + real(wp),dimension(144) :: g = 0.0_wp !! `g(m)` -- normalized field coefficients (see [[feldcof]]) m=nmax*(nmax+2) + + ! formerly saved vars in shellg: + real(wp) :: step = 0.20_wp !! step size for field line tracing + real(wp) :: steq = 0.03_wp !! step size for integration + + ! from feldcof, so we can cache the coefficients + real(wp),dimension(120) :: gh2 = 0.0_wp ! JW : why is this 120 and g is 144 ??? + + contains + private + + procedure,public :: igrf + + procedure, public :: feldcof + procedure, public :: feldg + procedure, public :: shellg + procedure, public :: findb0 + procedure :: stoer, getshc, intershc, extrashc + + end type shellig_type + + contains +!***************************************************************************************** + +!***************************************************************************************** +!> +! Wrapper for IGRF functions. + + subroutine igrf(me,lon,lat,height,year,xl,bbx) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: lon !! geodetic longitude in degrees (east) + real(wp),intent(in) :: lat !! geodetic latitude in degrees (north) + real(wp),intent(in) :: height !! altitude in km above sea level + real(wp),intent(in) :: year !! decimal year for which geomagnetic field is to + !! be calculated (e.g.:1995.5 for day 185 of 1995) + real(wp),intent(out) :: xl !! l-value + real(wp),intent(out) :: bbx + + real(wp) :: bab1 , babs , bdel , bdown , beast , & + beq , bequ , bnorth , dimo , rr0 + integer :: icode + logical :: val + + real(wp),parameter :: stps = 0.05_wp + + call me%feldcof(year,dimo) + call me%feldg(lat,lon,height,bnorth,beast,bdown,babs) + call me%shellg(lat,lon,height,dimo,xl,icode,bab1) + + bequ = dimo/(xl*xl*xl) + if ( icode==1 ) then + bdel = 1.0e-3_wp + call me%findb0(stps,bdel,val,beq,rr0) + if ( val ) bequ = beq + endif + bbx = babs/bequ + + end subroutine igrf +!***************************************************************************************** + +!***************************************************************************************** +!> + subroutine findb0(me,stps,bdel,value,bequ,rr0) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: stps + real(wp),intent(inout) :: bdel + real(wp),intent(out) :: bequ + logical,intent(out) :: value + real(wp),intent(out) :: rr0 + + real(wp) :: b , bdelta , bmin , bold , bq1 , & + bq2 , bq3 , p(8,4) , r1 , r2 , r3 , & + rold , step , step12 , zz + integer :: i , irun , j , n + + step=stps + irun=0 + + main : do + irun=irun+1 + if (irun>5) then + value=.false. + exit main + endif + !*********************first three points + p(1,2)=me%sp(1) + p(2,2)=me%sp(2) + p(3,2)=me%sp(3) + step=-sign(step,p(3,2)) + call me%stoer(p(1,2),bq2,r2) + p(1,3)=p(1,2)+0.5_wp*step*p(4,2) + p(2,3)=p(2,2)+0.5_wp*step*p(5,2) + p(3,3)=p(3,2)+0.5_wp*step + call me%stoer(p(1,3),bq3,r3) + p(1,1)=p(1,2)-step*(2.0_wp*p(4,2)-p(4,3)) + p(2,1)=p(2,2)-step*(2.0_wp*p(5,2)-p(5,3)) + p(3,1)=p(3,2)-step + call me%stoer(p(1,1),bq1,r1) + p(1,3)=p(1,2)+step*(20.0_wp*p(4,3)-3.*p(4,2)+p(4,1))/18.0_wp + p(2,3)=p(2,2)+step*(20.0_wp*p(5,3)-3.*p(5,2)+p(5,1))/18.0_wp + p(3,3)=p(3,2)+step + call me%stoer(p(1,3),bq3,r3) + !******************invert sense if required + if (bq3>bq1) then + step=-step + r3=r1 + bq3=bq1 + do i=1,5 + zz=p(i,1) + p(i,1)=p(i,3) + p(i,3)=zz + end do + end if + !******************initialization + step12=step/12.0_wp + value=.true. + bmin=1.0e4_wp + bold=1.0e4_wp + !******************corrector (field line tracing) + n=0 + corrector : do + p(1,3)=p(1,2)+step12*(5.0_wp*p(4,3)+8.0_wp*p(4,2)-p(4,1)) + n=n+1 + p(2,3)=p(2,2)+step12*(5.0_wp*p(5,3)+8.0_wp*p(5,2)-p(5,1)) + !******************predictor (field line tracing) + p(1,4)=p(1,3)+step12*(23.0_wp*p(4,3)-16.0_wp*p(4,2)+5.0_wp*p(4,1)) + p(2,4)=p(2,3)+step12*(23.0_wp*p(5,3)-16.0_wp*p(5,2)+5.0_wp*p(5,1)) + p(3,4)=p(3,3)+step + call me%stoer(p(1,4),bq3,r3) + do j=1,3 + do i=1,8 + p(i,j)=p(i,j+1) + end do + end do + b=sqrt(bq3) + if (b<bmin) bmin=b + if (b>bold) exit corrector + bold=b + rold=1.0_wp/r3 + me%sp(1)=p(1,4) + me%sp(2)=p(2,4) + me%sp(3)=p(3,4) + end do corrector + if (bold/=bmin) value=.false. + bdelta=(b-bold)/bold + if (bdelta<=bdel) exit main + step=step/10.0_wp + end do main + + rr0=rold + bequ=bold + bdel=bdelta + + end subroutine findb0 + +!***************************************************************************************** +!> +! calculates l-value for specified geodaetic coordinates, altitude +! and gemagnetic field model. +! +!### Reference +! * G. KLUGE, EUROPEAN SPACE OPERATIONS CENTER, INTERNAL NOTE +! NO. 67, 1970. +! * G. KLUGE, COMPUTER PHYSICS COMMUNICATIONS 3, 31-35, 1972 +! +!### History +! * CHANGES (D. BILITZA, NOV 87): +! - USING CORRECT DIPOL MOMENT I.E.,DIFFERENT COMMON/MODEL/ +! - USING IGRF EARTH MAGNETIC FIELD MODELS FROM 1945 TO 1990 + + subroutine shellg(me,glat,glon,alt,dimo,fl,icode,b0) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: glat !! GEODETIC LATITUDE IN DEGREES (NORTH) + real(wp),intent(in) :: glon !! GEODETIC LONGITUDE IN DEGREES (EAST) + real(wp),intent(in) :: alt !! ALTITUDE IN KM ABOVE SEA LEVEL + real(wp),intent(in) :: dimo !! DIPOL MOMENT IN GAUSS (NORMALIZED TO EARTH RADIUS) + real(wp),intent(out) :: fl !! l-value + integer,intent(out) :: icode !! * =1 normal completion + !! * =2 unphysical conjugate point (fl meaningless) + !! * =3 shell parameter greater than limit up to + !! which accurate calculation is required; + !! approximation is used. + real(wp),intent(out) :: b0 !! magnetic field strength in gauss + + real(wp) :: arg1 , arg2 , bequ , bq1 , bq2 , bq3 , c0 , c1 , c2 , c3 , & + ct , d , d0 , d1 , d2, dimob0 , e0 , e1 , e2 , ff , fi , gg , & + hli , oradik , oterm , p(8,100) , r , r1 , r2 , r3 , r3h , radik , & + rlat , rlon , rq , st , step12 , step2 , & + stp , t , term , v(3) , xx , z , zq , zz + integer :: i , iequ , n + + real(wp),parameter :: rmin = 0.05_wp !! boundaries for identification of `icode=2 and 3` + real(wp),parameter :: rmax = 1.01_wp !! boundaries for identification of `icode=2 and 3` + + bequ = 1.0e10_wp + + !*****ENTRY POINT SHELLG TO BE USED WITH GEODETIC CO-ORDINATES + rlat = Glat*Umr + ct = sin(rlat) + st = cos(rlat) + d = sqrt(Aquad-(Aquad-Bquad)*ct*ct) + me%Xi(1) = (Alt+Aquad/d)*st/Era + me%Xi(3) = (Alt+Bquad/d)*ct/Era + rlon = Glon*Umr + me%Xi(2) = me%Xi(1)*sin(rlon) + me%Xi(1) = me%Xi(1)*cos(rlon) + CALL spag_block_1() + RETURN + +!*****ENTRY POINT SHELLC TO BE USED WITH CARTESIAN CO-ORDINATES ! JW : does not appear to be used anywhere. +! V(3) CARTESIAN COORDINATES IN EARTH RADII (6371.2 KM) +! X-AXIS POINTING TO EQUATOR AT 0 LONGITUDE +! Y-AXIS POINTING TO EQUATOR AT 90 LONG. +! Z-AXIS POINTING TO NORTH POLE + ENTRY shellc(me,V,Fl,B0) + me%Xi(1) = V(1) + me%Xi(2) = V(2) + me%Xi(3) = V(3) + CALL spag_block_1() + +CONTAINS + + subroutine spag_block_1 + + integer,parameter :: max_loop_index = 100 ! 3333 <--- JW : original code had 3333 ... was this a bug ???? + + !*****CONVERT TO DIPOL-ORIENTED CO-ORDINATES + rq = 1.0_wp/(me%Xi(1)*me%Xi(1)+me%Xi(2)*me%Xi(2)+me%Xi(3)*me%Xi(3)) + r3h = sqrt(rq*sqrt(rq)) + p(1,2) = (me%Xi(1)*u(1,1)+me%Xi(2)*u(2,1)+me%Xi(3)*u(3,1))*r3h + p(2,2) = (me%Xi(1)*u(1,2)+me%Xi(2)*u(2,2))*r3h + p(3,2) = (me%Xi(1)*u(1,3)+me%Xi(2)*u(2,3)+me%Xi(3)*u(3,3))*rq + ! *****FIRST THREE POINTS OF FIELD LINE + me%step = -sign(me%step,p(3,2)) + call me%stoer(p(1,2),bq2,r2) + B0 = sqrt(bq2) + p(1,3) = p(1,2) + 0.5_wp*me%step*p(4,2) + p(2,3) = p(2,2) + 0.5_wp*me%step*p(5,2) + p(3,3) = p(3,2) + 0.5_wp*me%step + call me%stoer(p(1,3),bq3,r3) + p(1,1) = p(1,2) - me%step*(2.0_wp*p(4,2)-p(4,3)) + p(2,1) = p(2,2) - me%step*(2.0_wp*p(5,2)-p(5,3)) + p(3,1) = p(3,2) - me%step + call me%stoer(p(1,1),bq1,r1) + p(1,3) = p(1,2) + me%step*(20.0_wp*p(4,3)-3.*p(4,2)+p(4,1))/18.0_wp + p(2,3) = p(2,2) + me%step*(20.0_wp*p(5,3)-3.*p(5,2)+p(5,1))/18.0_wp + p(3,3) = p(3,2) + me%step + call me%stoer(p(1,3),bq3,r3) + !*****INVERT SENSE IF REQUIRED + IF ( bq3>bq1 ) THEN + me%step = -me%step + r3 = r1 + bq3 = bq1 + DO i = 1 , 7 + zz = p(i,1) + p(i,1) = p(i,3) + p(i,3) = zz + ENDDO + ENDIF + !*****SEARCH FOR LOWEST MAGNETIC FIELD STRENGTH + IF ( bq1<bequ ) THEN + bequ = bq1 + iequ = 1 + ENDIF + IF ( bq2<bequ ) THEN + bequ = bq2 + iequ = 2 + ENDIF + IF ( bq3<bequ ) THEN + bequ = bq3 + iequ = 3 + ENDIF + !*****INITIALIZATION OF INTEGRATION LOOPS + step12 = me%step/12.0_wp + step2 = me%step + me%step + me%steq = sign(me%steq,me%step) + fi = 0.0_wp + Icode = 1 + oradik = 0.0_wp + oterm = 0.0_wp + stp = r2*me%steq + z = p(3,2) + stp + stp = stp/0.75_wp + p(8,1) = step2*(p(1,1)*p(4,1)+p(2,1)*p(5,1)) + p(8,2) = step2*(p(1,2)*p(4,2)+p(2,2)*p(5,2)) + !*****MAIN LOOP (FIELD LINE TRACING) + main: DO n = 3 , max_loop_index + !*****CORRECTOR (FIELD LINE TRACING) + p(1,n) = p(1,n-1) + step12*(5.0_wp*p(4,n)+8.0_wp*p(4,n-1)-p(4,n-2)) + p(2,n) = p(2,n-1) + step12*(5.0_wp*p(5,n)+8.0_wp*p(5,n-1)-p(5,n-2)) + !*****PREPARE EXPANSION COEFFICIENTS FOR INTERPOLATION + !*****OF SLOWLY VARYING QUANTITIES + p(8,n) = step2*(p(1,n)*p(4,n)+p(2,n)*p(5,n)) + c0 = p(1,n-1)**2 + p(2,n-1)**2 + c1 = p(8,n-1) + c2 = (p(8,n)-p(8,n-2))*0.25_wp + c3 = (p(8,n)+p(8,n-2)-c1-c1)/6.0_wp + d0 = p(6,n-1) + d1 = (p(6,n)-p(6,n-2))*0.5_wp + d2 = (p(6,n)+p(6,n-2)-d0-d0)*0.5_wp + e0 = p(7,n-1) + e1 = (p(7,n)-p(7,n-2))*0.5_wp + e2 = (p(7,n)+p(7,n-2)-e0-e0)*0.5_wp + inner: DO + !*****INNER LOOP (FOR QUADRATURE) + t = (z-p(3,n-1))/me%step + IF ( t>1.0_wp ) THEN + !*****PREDICTOR (FIELD LINE TRACING) + p(1,n+1) = p(1,n) + step12*(23.0_wp*p(4,n)-16.0_wp*p(4,n-1)+5.0_wp*p(4,n-2)) + p(2,n+1) = p(2,n) + step12*(23.0_wp*p(5,n)-16.0_wp*p(5,n-1)+5.0_wp*p(5,n-2)) + p(3,n+1) = p(3,n) + me%step + call me%stoer(p(1,n+1),bq3,r3) + !*****SEARCH FOR LOWEST MAGNETIC FIELD STRENGTH + IF ( bq3<bequ ) THEN + iequ = n + 1 + bequ = bq3 + ENDIF + EXIT inner + ELSE + hli = 0.5_wp*(((c3*t+c2)*t+c1)*t+c0) + zq = z*z + r = hli + sqrt(hli*hli+zq) + IF ( r<=rmin ) THEN + !*****APPROXIMATION FOR HIGH VALUES OF L. + Icode = 3 + t = -p(3,n-1)/me%step + Fl = 1.0_wp/(abs(((c3*t+c2)*t+c1)*t+c0)+1.0e-15_wp) + RETURN + ENDIF + rq = r*r + ff = sqrt(1.0_wp+3.0_wp*zq/rq) + radik = B0 - ((d2*t+d1)*t+d0)*r*rq*ff + IF ( r>rmax ) THEN + Icode = 2 + radik = radik - 12.0_wp*(r-rmax)**2 + ENDIF + IF ( radik+radik<=oradik ) EXIT main + term = sqrt(radik)*ff*((e2*t+e1)*t+e0)/(rq+zq) + fi = fi + stp*(oterm+term) + oradik = radik + oterm = term + stp = r*me%steq + z = z + stp + ENDIF + ENDDO inner + ENDDO main + IF ( iequ<2 ) iequ = 2 + me%Sp(1) = p(1,iequ-1) + me%Sp(2) = p(2,iequ-1) + me%Sp(3) = p(3,iequ-1) + IF ( oradik>=1.0e-15_wp ) fi = fi + stp/0.75_wp*oterm*oradik/(oradik-radik) + ! + !-- The minimal allowable value of FI was changed from 1E-15 to 1E-12, + !-- because 1E-38 is the minimal allowable arg. for ALOG in our envir. + !-- D. Bilitza, Nov 87. + ! + fi = 0.5_wp*abs(fi)/sqrt(B0) + 1.0e-12_wp + !*****COMPUTE L FROM B AND I. SAME AS CARMEL IN INVAR. + ! + !-- Correct dipole moment is used here. D. Bilitza, Nov 87. + ! + dimob0 = Dimo/B0 + arg1 = log(fi) + arg2 = log(dimob0) +! arg = FI*FI*FI/DIMOB0 +! if(abs(arg)>88.0_wp) arg=88.0_wp + xx = 3*arg1 - arg2 + IF ( xx>23.0_wp ) THEN + gg = xx - 3.0460681_wp + ELSEIF ( xx>11.7_wp ) THEN + gg = (((((2.8212095E-8_wp*xx-3.8049276E-6_wp)*xx+& + 2.170224E-4_wp)*xx-6.7310339E-3_wp)*xx+& + 1.2038224E-1_wp)*xx-1.8461796E-1_wp)*xx + 2.0007187_wp + ELSEIF ( xx>+3.0_wp ) THEN + gg = ((((((((6.3271665E-10_wp*xx-3.958306E-8_wp)*xx+& + 9.9766148E-07_wp)*xx-1.2531932E-5_wp)*xx+& + 7.9451313E-5_wp)*xx-3.2077032E-4_wp)*xx+& + 2.1680398E-3_wp)*xx+1.2817956E-2_wp)*xx+& + 4.3510529E-1_wp)*xx + 6.222355E-1_wp + ELSEIF ( xx>-3.0_wp ) THEN + gg = ((((((((2.6047023E-10_wp*xx+2.3028767E-9_wp)*xx-& + 2.1997983E-8_wp)*xx-5.3977642E-7_wp)*xx-& + 3.3408822E-6_wp)*xx+3.8379917E-5_wp)*xx+& + 1.1784234E-3_wp)*xx+1.4492441E-2_wp)*xx+& + 4.3352788E-1_wp)*xx + 6.228644E-1_wp + ELSEIF ( xx>-22.0_wp ) THEN + gg = ((((((((-8.1537735E-14_wp*xx+8.3232531E-13_wp)*xx+& + 1.0066362E-9_wp)*xx+8.1048663E-8_wp)*xx+& + 3.2916354E-6_wp)*xx+8.2711096E-5_wp)*xx+& + 1.3714667E-3_wp)*xx+1.5017245E-2_wp)*xx+& + 4.3432642E-1_wp)*xx + 6.2337691E-1_wp + ELSE + gg = 3.33338E-1_wp*xx + 3.0062102E-1_wp + ENDIF + Fl = exp(log((1.0_wp+exp(gg))*dimob0)/3.0_wp) + RETURN + END subroutine spag_block_1 + +END subroutine shellg + +!***************************************************************************************** +!> +! subroutine used for field line tracing in [[shellg]] +! calls entry point [[feldi]] in geomagnetic field subroutine [[feldg]] + +subroutine stoer(me,p,bq,r) + + class(shellig_type),intent(inout) :: me + real(wp),dimension(7),intent(inout) :: p + real(wp),intent(out) :: bq + real(wp),intent(out) :: r + + real(wp) :: dr , dsq , dx , dxm , dy , dym , dz , & + dzm , fli , q , rq , wr , xm , ym , zm + +!*****XM,YM,ZM ARE GEOMAGNETIC CARTESIAN INVERSE CO-ORDINATES + zm = P(3) + fli = P(1)*P(1) + P(2)*P(2) + 1.0e-15_wp + R = 0.5_wp*(fli+sqrt(fli*fli+(zm+zm)**2)) + rq = R*R + wr = sqrt(R) + xm = P(1)*wr + ym = P(2)*wr +!*****TRANSFORM TO GEOGRAPHIC CO-ORDINATE SYSTEM + me%Xi(1) = xm*u(1,1) + ym*u(1,2) + zm*u(1,3) + me%Xi(2) = xm*u(2,1) + ym*u(2,2) + zm*u(2,3) + me%Xi(3) = xm*u(3,1) + zm*u(3,3) +!*****COMPUTE DERIVATIVES +! Changed from CALL FELDI(XI,H); XI, H are in COMMON block; results +! are the same; dkb Feb 1998. +! JW : feb 2024 : xi, h now class variables. + CALL feldi(me) + q = me%H(1)/rq + dx = me%H(3) + me%H(3) + q*me%Xi(1) + dy = me%H(4) + me%H(4) + q*me%Xi(2) + dz = me%H(2) + me%H(2) + q*me%Xi(3) +!*****TRANSFORM BACK TO GEOMAGNETIC CO-ORDINATE SYSTEM + dxm = u(1,1)*dx + u(2,1)*dy + u(3,1)*dz + dym = u(1,2)*dx + u(2,2)*dy + dzm = u(1,3)*dx + u(2,3)*dy + u(3,3)*dz + dr = (xm*dxm+ym*dym+zm*dzm)/R +!*****FORM SLOWLY VARYING EXPRESSIONS + P(4) = (wr*dxm-0.5_wp*P(1)*dr)/(R*dzm) + P(5) = (wr*dym-0.5_wp*P(2)*dr)/(R*dzm) + dsq = rq*(dxm*dxm+dym*dym+dzm*dzm) + Bq = dsq*rq*rq + P(6) = sqrt(dsq/(rq+3.0_wp*zm*zm)) + P(7) = P(6)*(rq+zm*zm)/(rq*dzm) +END subroutine stoer + +!***************************************************************************************** +!> +! Calculates earth magnetic field from spherical harmonics model +! +!### Reference +! ref: g. kluge, european space operations centre, internal note 61, +! 1970. +! +!### History +! * changes (d. bilitza, nov 87): +! - field coefficients in binary data files instead of block data +! - calculates dipol moment + +subroutine feldg(me,glat,glon,alt,bnorth,beast,bdown,babs) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: glat !! geodetic latitude in degrees (north) + real(wp),intent(in) :: glon !! geodetic longitude in degrees (east) + real(wp),intent(in) :: alt !! altitude in km above sea level + real(wp),intent(out) :: bnorth, beast, bdown !! components of the field with respect + !! to the local geodetic coordinate system, with axis + !! pointing in the tangential plane to the north, east + !! and downward. + real(wp),intent(out) :: Babs !! magnetic field strength in gauss + + real(wp) :: b(3) , brho , bxxx , & + byyy , bzzz , cp , ct , d , f , rho , & + rlat , rlon , rq , s , sp , st , t , v(3) , x , xxx , & + y , yyy , z , zzz + integer :: i , ih , ihmax , il , imax , is , k , last , m + + !-- is records entry point + ! + !*****entry point feldg to be used with geodetic co-ordinates + is=1 + rlat=glat*umr + ct=sin(rlat) + st=cos(rlat) + d=sqrt(aquad-(aquad-bquad)*ct*ct) + rlon=glon*umr + cp=cos(rlon) + sp=sin(rlon) + zzz=(alt+bquad/d)*ct/era + rho=(alt+aquad/d)*st/era + xxx=rho*cp + yyy=rho*sp + goto 10 + + !*****entry point feldc to be used with cartesian co-ordinates + ! v(3) cartesian coordinates in earth radii (6371.2 km) + ! x-axis pointing to equator at 0 longitude + ! y-axis pointing to equator at 90 long. + ! z-axis pointing to north pole + entry feldc(me,v,b) + is=2 + xxx=v(1) + yyy=v(2) + zzz=v(3) + + 10 rq=1.0_wp/(xxx*xxx+yyy*yyy+zzz*zzz) + me%xi(1)=xxx*rq + me%xi(2)=yyy*rq + me%xi(3)=zzz*rq + goto 20 + + !*****entry point feldi used for l computation + entry feldi(me) + is=3 + 20 ihmax=me%nmax*me%nmax+1 + last=ihmax+me%nmax+me%nmax + imax=me%nmax+me%nmax-1 + do i=ihmax,last + me%h(i)=me%g(i) + end do + do k=1,3,2 + i=imax + ih=ihmax + do + il=ih-i + f=2.0_wp/real(i-k+2, wp) + x=me%xi(1)*f + y=me%xi(2)*f + z=me%xi(3)*(f+f) + i=i-2 + if ((i-1)>=0) then + if ((i-1)>0) then + do m=3,i,2 + me%h(il+m+1)=me%g(il+m+1)+z*me%h(ih+m+1)+x*(me%h(ih+m+3)-& + me%h(ih+m-1))-y*(me%h(ih+m+2)+me%h(ih+m-2)) + me%h(il+m)=me%g(il+m)+z*me%h(ih+m)+x*(me%h(ih+m+2)-& + me%h(ih+m-2))+y*(me%h(ih+m+3)+me%h(ih+m-1)) + end do + end if + me%h(il+2)=me%g(il+2)+z*me%h(ih+2)+x*me%h(ih+4)-y*(me%h(ih+3)+me%h(ih)) + me%h(il+1)=me%g(il+1)+z*me%h(ih+1)+y*me%h(ih+4)+x*(me%h(ih+3)-me%h(ih)) + end if + me%h(il)=me%g(il)+z*me%h(ih)+2.0_wp*(x*me%h(ih+1)+y*me%h(ih+2)) + ih=il + if (i<k) exit + end do + end do + + if (is==3) return + + s=0.5_wp*me%h(1)+2.0_wp*(me%h(2)*me%xi(3)+me%h(3)*me%xi(1)+me%h(4)*me%xi(2)) + t=(rq+rq)*sqrt(rq) + bxxx=t*(me%h(3)-s*xxx) + byyy=t*(me%h(4)-s*yyy) + bzzz=t*(me%h(2)-s*zzz) + if (is==2) then + b(1)=bxxx + b(2)=byyy + b(3)=bzzz + else + babs=sqrt(bxxx*bxxx+byyy*byyy+bzzz*bzzz) + beast=byyy*cp-bxxx*sp + brho=byyy*sp+bxxx*cp + bnorth=bzzz*st-brho*ct + bdown=-bzzz*ct-brho*st + end if + + end subroutine feldg + +!***************************************************************************************** +!> +! Determines coefficients and dipol moment from IGRF models +! +!### Author +! * D. BILITZA, NSSDC, GSFC, CODE 633, GREENBELT, MD 20771, +! (301) 286-9536 NOV 1987. +! +!### History +! * corrected for 2000 update - dkb- 5/31/2000 +! * updated to IGRF-2000 version -dkb- 5/31/2000 +! * updated to IGRF-2005 version -dkb- 3/24/2000 + + subroutine feldcof(me,year,dimo) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: year !! decimal year for which geomagnetic field is to + !! be calculated (e.g.:1995.5 for day 185 of 1995) + real(wp),intent(out) :: dimo !! geomagnetic dipol moment in gauss (normalized + !! to earth's radius) at the time (year) + + real(wp) :: dte1 , dte2 , erad , gha(144) , sqrt2 + integer :: i , ier , j , l , m , n , nmax1 , nmax2, iyea + character(len=filename_len) :: fil2 + real(wp) :: x , f0 , f !! these were double precision in original + !! code while everything else was single precision + + ! changed to conform with IGRF 45-95, also FILMOD, DTEMOD arrays +1 + character(len=filename_len),dimension(17),parameter :: filmod = [& + 'dgrf1945.dat ' , 'dgrf1950.dat ' , 'dgrf1955.dat ' , 'dgrf1960.dat ' , & + 'dgrf1965.dat ' , 'dgrf1970.dat ' , 'dgrf1975.dat ' , 'dgrf1980.dat ' , & + 'dgrf1985.dat ' , 'dgrf1990.dat ' , 'dgrf1995.dat ' , 'dgrf2000.dat ' , & + 'dgrf2005.dat ' , 'dgrf2010.dat ' , 'dgrf2015.dat ' , 'igrf2020.dat ' , & + 'igrf2020s.dat'] + real(wp),dimension(17),parameter :: dtemod = [1945.0_wp , 1950.0_wp , 1955.0_wp , & + 1960.0_wp , 1965.0_wp , 1970.0_wp , & + 1975.0_wp , 1980.0_wp , 1985.0_wp , & + 1990.0_wp , 1995.0_wp , 2000.0_wp , & + 2005.0_wp , 2010.0_wp , 2015.0_wp , & + 2020.0_wp , 2025.0_wp] + integer,parameter :: numye = size(dtemod)-1 ! number of 5-year priods represented by IGRF + integer,parameter :: is = 0 !! * is=0 for schmidt normalization + !! * is=1 gauss normalization + + logical :: read_file + + !-- determine igrf-years for input-year + me%time = year + iyea = int(year/5.0_wp)*5 + read_file = iyea /= me%iyea ! if we have to read the file + me%iyea = iyea + l = (me%iyea-1945)/5 + 1 + if ( l<1 ) l = 1 + if ( l>numye ) l = numye + dte1 = dtemod(l) + me%name = filmod(l) + dte2 = dtemod(l+1) + fil2 = filmod(l+1) + if (read_file) then + ! get igrf coefficients for the boundary years + ! [if they have not ready been loaded] + call me%getshc(me%name,nmax1,erad,me%g,ier) + if ( ier/=0 ) error stop 'error reading file: '//trim(me%name) + call me%getshc(fil2,nmax2,erad,me%gh2,ier) + if ( ier/=0 ) error stop 'error reading file: '//trim(fil2) + end if + !-- determine igrf coefficients for year + if ( l<=numye-1 ) then + call me%intershc(year,dte1,nmax1,me%g,dte2,nmax2,me%gh2,me%nmax,gha) + else + call me%extrashc(year,dte1,nmax1,me%g,nmax2,me%gh2,me%nmax,gha) + endif + !-- determine magnetic dipol moment and coeffiecients g + f0 = 0.0_wp + do j = 1 , 3 + f = gha(j)*1.0e-5_wp + f0 = f0 + f*f + enddo + dimo = sqrt(f0) + + me%g(1) = 0.0_wp + i = 2 + f0 = 1.0e-5_wp + if ( is==0 ) f0 = -f0 + sqrt2 = sqrt(2.0_wp) + + do n = 1 , me%nmax + x = n + f0 = f0*x*x/(4.0_wp*x-2.0_wp) + if ( is==0 ) f0 = f0*(2.0_wp*x-1.0_wp)/x + f = f0*0.5_wp + if ( is==0 ) f = f*sqrt2 + me%g(i) = gha(i-1)*f0 + i = i + 1 + do m = 1 , n + f = f*(x+m)/(x-m+1.0_wp) + if ( is==0 ) f = f*sqrt((x-m+1.0_wp)/(x+m)) + me%g(i) = gha(i-1)*f + me%g(i+1) = gha(i)*f + i = i + 2 + enddo + enddo + +end subroutine feldcof + +!***************************************************************************************** +!> +! Reads spherical harmonic coefficients from the specified +! file into an array. +! +!### Author +! * Version 1.01, A. Zunde, USGS, MS 964, +! Box 25046 Federal Center, Denver, CO 80225 + +subroutine getshc(me,Fspec,Nmax,Erad,Gh,Ier) + + class(shellig_type),intent(inout) :: me + character(len=*),intent(in) :: Fspec !! File specification + integer,intent(out) :: Nmax !! Maximum degree and order of model + real(wp),intent(out) :: Erad !! Earth's radius associated with the spherical + !! harmonic coefficients, in the same units as + !! elevation + real(wp),dimension(*),intent(out) :: Gh !! Schmidt quasi-normal internal spherical + !! harmonic coefficients + integer,intent(out) :: Ier !! Error number: + !! + !! * 0, no error + !! * -2, records out of order + !! * FORTRAN run-time error number + + integer :: iu !! logical unit number + real(wp) :: g , h + integer :: i , m , mm , n , nn + + read_file : block + ! --------------------------------------------------------------- + ! Open coefficient file. Read past first header record. + ! Read degree and order of model and Earth's radius. + ! --------------------------------------------------------------- + OPEN (newunit=Iu,FILE=Fspec,STATUS='OLD',IOSTAT=Ier) + if (Ier/=0) then + write(*,*) 'Error opening file: '//trim(fspec) + exit read_file + end if + READ (Iu,*,IOSTAT=Ier) + if (Ier/=0) exit read_file + READ (Iu,*,IOSTAT=Ier) Nmax , Erad + if (Ier/=0) exit read_file + + ! --------------------------------------------------------------- + ! Read the coefficient file, arranged as follows: + ! + ! N M G H + ! ---------------------- + ! / 1 0 GH(1) - + ! / 1 1 GH(2) GH(3) + ! / 2 0 GH(4) - + ! / 2 1 GH(5) GH(6) + ! NMAX*(NMAX+3)/2 / 2 2 GH(7) GH(8) + ! records \ 3 0 GH(9) - + ! \ . . . . + ! \ . . . . + ! NMAX*(NMAX+2) \ . . . . + ! elements in GH \ NMAX NMAX . . + ! + ! N and M are, respectively, the degree and order of the + ! coefficient. + ! --------------------------------------------------------------- + i = 0 + main: DO nn = 1 , Nmax + DO mm = 0 , nn + READ (Iu,*,IOSTAT=Ier) n , m , g , h + if (Ier/=0) exit main + IF ( nn/=n .OR. mm/=m ) THEN + Ier = -2 + EXIT main + ENDIF + i = i + 1 + Gh(i) = g + IF ( m/=0 ) THEN + i = i + 1 + Gh(i) = h + ENDIF + ENDDO + ENDDO main + + end block read_file + + CLOSE (Iu) + +END subroutine getshc + +!***************************************************************************************** +!> +! Interpolates linearly, in time, between two spherical +! harmonic models. +! +! The coefficients (GH) of the resulting model, at date +! DATE, are computed by linearly interpolating between the +! coefficients of the earlier model (GH1), at date DTE1, +! and those of the later model (GH2), at date DTE2. If one +! model is smaller than the other, the interpolation is +! performed with the missing coefficients assumed to be 0. +! +!### Author +! * Version 1.01, A. Zunde +! USGS, MS 964, Box 25046 Federal Center, Denver, CO 80225 + +subroutine intershc(me,date,dte1,nmax1,gh1,dte2,nmax2,gh2,nmax,gh) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: date !! Date of resulting model (in decimal year) + real(wp),intent(in) :: dte1 !! Date of earlier model + integer,intent(in) :: nmax1 !! Maximum degree and order of earlier model + real(wp),intent(in) :: gh1(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of earlier model + real(wp),intent(in) :: dte2 !! Date of later model + integer,intent(in) :: nmax2 !! Maximum degree and order of later model + real(wp),intent(in) :: gh2(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of later model + real(wp),intent(out) :: gh(*) !! Coefficients of resulting model + integer,intent(out) :: nmax !! Maximum degree and order of resulting model + + real(wp) :: factor + integer :: i , k , l + + factor = (date-dte1)/(dte2-dte1) + + if ( nmax1==nmax2 ) then + k = nmax1*(nmax1+2) + nmax = nmax1 + elseif ( nmax1>nmax2 ) then + k = nmax2*(nmax2+2) + l = nmax1*(nmax1+2) + do i = k + 1 , l + gh(i) = gh1(i) + factor*(-gh1(i)) + enddo + nmax = nmax1 + else + k = nmax1*(nmax1+2) + l = nmax2*(nmax2+2) + do i = k + 1 , l + gh(i) = factor*gh2(i) + enddo + nmax = nmax2 + endif + + do i = 1 , k + gh(i) = gh1(i) + factor*(gh2(i)-gh1(i)) + enddo + +end subroutine intershc + +!***************************************************************************************** +!> +! Extrapolates linearly a spherical harmonic model with a +! rate-of-change model. +! +! The coefficients (GH) of the resulting model, at date +! DATE, are computed by linearly extrapolating the coef- +! ficients of the base model (GH1), at date DTE1, using +! those of the rate-of-change model (GH2), at date DTE2. If +! one model is smaller than the other, the extrapolation is +! performed with the missing coefficients assumed to be 0. +! +!### Author +! * Version 1.01, A. Zunde +! USGS, MS 964, Box 25046 Federal Center, Denver, CO 80225 + +subroutine extrashc(me,date,dte1,nmax1,gh1,nmax2,gh2,nmax,gh) + + class(shellig_type),intent(inout) :: me + real(wp),intent(in) :: date !! Date of resulting model (in decimal year) + real(wp),intent(in) :: dte1 !! Date of base model + integer,intent(in) :: nmax1 !! Maximum degree and order of base model + real(wp),intent(in) :: gh1(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of base model + integer,intent(in) :: nmax2 !! Maximum degree and order of rate-of-change model + real(wp),intent(in) :: gh2(*) !! Schmidt quasi-normal internal spherical harmonic coefficients of rate-of-change model + real(wp),intent(out) :: gh(*) !! Coefficients of resulting model + integer,intent(out) :: nmax !! Maximum degree and order of resulting model + + real(wp) :: factor + integer :: i , k , l + + factor = (date-dte1) + + if ( nmax1==nmax2 ) then + k = nmax1*(nmax1+2) + nmax = nmax1 + elseif ( nmax1>nmax2 ) then + k = nmax2*(nmax2+2) + l = nmax1*(nmax1+2) + do i = k + 1 , l + gh(i) = gh1(i) + enddo + nmax = nmax1 + else + k = nmax1*(nmax1+2) + l = nmax2*(nmax2+2) + do i = k + 1 , l + gh(i) = factor*gh2(i) + enddo + nmax = nmax2 + endif + + do i = 1 , k + gh(i) = gh1(i) + factor*gh2(i) + enddo + +end subroutine extrashc + +end module SHELLIG_module +
!***************************************************************************************** +!> +! Trapped radiation model. +! +!### History +! * Based on: `trmfun.for` 1987 + +module trmfun_module + + use radbelt_kinds_module + + implicit none + + private + + character(len=10),dimension(4),parameter :: mname = [ 'ae8min.asc' , & + 'ae8max.asc' , & + 'ap8min.asc' , & + 'ap8max.asc'] !! data files available + + type,public :: trm_type + !! main class for the `aep8` model + private + + ! data read from the files: + character(len=:),allocatable :: file_loaded !! the file that has been loaded + integer,dimension(8) :: ihead = 0 + integer,dimension(:),allocatable :: map + + real(wp) :: fistep = 0.0_wp !! the stepsize for the parameterization of the logarithm of flux. + !! formerly stored in common block `tra2` + + ! formerly saved variables in trara1: + real(wp) :: f1 = 1.001_wp + real(wp) :: f2 = 1.002_wp + + contains + private + procedure,public :: aep8 !! main routine + procedure,public :: trara1, trara2 !! low-level routine + end type trm_type + + contains + +!***************************************************************************************** +!> +! Main wrapper for the radiation model. +! Reads the coefficient file and calls the low-level routine. + + subroutine aep8(me,e,l,bb0,imname,flux) + + class(trm_type),intent(inout) :: me + + real(wp),intent(in) :: e + real(wp),intent(in) :: l + real(wp),intent(in) :: bb0 + integer,intent(in) :: imname !! which model to load (index in `mname` array) + real(wp),intent(out) :: flux + + real(wp) :: ee(1), f(1) !! temp variables + integer :: i , ierr, iuaeap , nmap + character(len=len(mname)) :: name + logical :: load_file + + name = mname(Imname) ! the file to load + + ! check to see if this file has already been loaded + ! [the class can store one file at a time] + load_file = .true. + if (allocated(me%file_loaded)) then + if (name == me%file_loaded) load_file = .false. + end if + + if (load_file) then + open (newunit = iuaeap,file=name,status='OLD',iostat=ierr,form='FORMATTED') + if ( ierr/=0 ) then + error stop 'error reading '//trim(name) + end if + read (iuaeap,'(1X,12I6)') me%ihead + nmap = me%ihead(8) + allocate(me%map(nmap)) + read (iuaeap,'(1X,12I6)') (me%map(i),i=1,nmap) + close (iuaeap) + me%file_loaded = trim(name) + end if + + ee(1) = e + call me%trara1(me%ihead,me%map,L,Bb0,ee,f,1) + flux = f(1) + IF ( Flux>0.0_wp ) Flux = 10.0_wp**Flux + + end subroutine aep8 +!***************************************************************************************** + +!***************************************************************************************** +!> +! [[trara1]] finds particle fluxes for given energies, magnetic field +! strength and l-value. function [[trara2]] is used to interpolate in +! b-l-space. + + subroutine trara1(me,descr,map,fl,bb0,e,f,n) + + class(trm_type),intent(inout) :: me + integer,intent(in) :: n !! number of energies + integer,intent(in) :: descr(8) !! header of specified trapped radition model + real(wp),intent(in) :: e(n) !! array of energies in mev + real(wp),intent(in) :: fl !! l-value + real(wp),intent(in) :: bb0 !! =b/b0 magnetic field strength normalized + !! to field strength at magnetic equator + integer,intent(in) :: map(*) !! map of trapped radition model + !! (descr and map are explained at the begin + !! of the main program model) + real(wp),intent(out) :: f(n) !! decadic logarithm of integral fluxes in + !! particles/(cm*cm*sec) + + real(wp) :: e0 , e1 , e2 , escale , f0 , fscale , xnl + real(wp) :: bb0_ !! local copy of `bb0`. in the original code + !! this was modified by this routine. + !! added this so `bb0` could be `intent(in)` + integer :: i0 , i1 , i2 , i3 , ie , l3 , nb , nl + logical :: s0 , s1 , s2 + + bb0_ = bb0 + me%fistep = descr(7)/descr(2) + escale = descr(4) + fscale = descr(7) + xnl = min(15.6_wp,abs(fl)) + nl = xnl*descr(5) + if ( bb0_<1.0_wp ) bb0_ = 1.0_wp + nb = (bb0_-1.0_wp)*descr(6) + + ! i2 is the number of elements in the flux map for the first energy. + ! i3 is the index of the last element of the second energy map. + ! l3 is the length of the map for the third energy. + ! e1 is the energy of the first energy map (unscaled) + ! e2 is the energy of the second energy map (unscaled) + i1 = 0 + i2 = map(1) + i3 = i2 + map(i2+1) + l3 = map(i3+1) + e1 = map(i1+2)/escale + e2 = map(i2+2)/escale + + ! s0, s1, s2 are logical variables which indicate whether the flux for + ! a particular e, b, l point has already been found in a previous call + ! to function trara2. if not, s.. =.true. + s1 = .true. + s2 = .true. + + ! energy loop + + do ie = 1 , n + + ! for each energy e(i) find the successive energies e0,e1,e2 in + ! model map, which obey e0 < e1 < e(i) < e2 . + + do while ( (e(ie)>e2) .and. (l3/=0) ) + i0 = i1 + i1 = i2 + i2 = i3 + i3 = i3 + l3 + l3 = map(i3+1) + e0 = e1 + e1 = e2 + e2 = map(i2+2)/escale + s0 = s1 + s1 = s2 + s2 = .true. + f0 = me%f1 + me%f1 = me%f2 + enddo + + ! call trara2 to interpolate the flux-maps for e1,e2 in l-b/b0- + ! space to find fluxes f1,f2 [if they have not already been + ! calculated for a previous e(i)]. + + if ( s1 ) me%f1 = me%trara2(map(i1+3),nl,nb)/fscale + if ( s2 ) me%f2 = me%trara2(map(i2+3),nl,nb)/fscale + s1 = .false. + s2 = .false. + + ! finally, interpolate in energy. + + f(ie) = me%f1 + (me%f2-me%f1)*(e(ie)-e1)/(e2-e1) + if ( me%f2<=0.0_wp ) then + if ( i1/=0 ) then + ! --------- special interpolation --------------------------------- + ! if the flux for the second energy cannot be found (i.e. f2=0.0), + ! and the zeroth energy map has been defined (i.e. i1 not equal 0), + ! then interpolate using the flux maps for the zeroth and first + ! energy and choose the minimum of this interpolations and the + ! interpolation that was done with f2=0. + if ( s0 ) f0 = me%trara2(map(i0+3),nl,nb)/fscale + s0 = .false. + f(ie) = min(f(ie),f0+(me%f1-f0)*(e(ie)-e0)/(e1-e0)) + endif + endif + + ! the logarithmic flux is always kept greater or equal zero. + + f(ie) = max(f(ie),0.0_wp) + enddo +end subroutine trara1 + +!***************************************************************************************** +!> +! [[trara2]] interpolates linearly in l-b/b0-map to obtain +! the logarithm of integral flux at given l and b/b0. +! +!### Note +! see main program 'model' for explanation of map format +! scaling factors. + +function trara2(me,map,il,ib) + + class(trm_type),intent(inout) :: me + integer,intent(in) :: map(*) !! is sub-map (for specific energy) of + !! trapped radiation model map + integer,intent(in) :: il !! scaled l-value + integer,intent(in) :: ib !! scaled b/b0-1 + real(wp) :: trara2 !! scaled logarithm of particle flux + + real(wp) :: dfl , fincr1 , fincr2 , fistep , fkb , fkb1 , fkb2 , fkbj1 , fkbj2 , & + fkbm , fll1 , fll2 , flog , flog1 , flog2 , flogm , & + fnb , fnl , sl1 , sl2 + integer :: i1 , i2 , itime , j1 , j2 , kt , l1 , l2 + + integer :: spag_nextblock_1 + + fistep = me%fistep + + spag_nextblock_1 = 1 + main: do + select case (spag_nextblock_1) + case (1) + fnl = il + fnb = ib + itime = 0 + i2 = 0 + do + + ! find consecutive sub-sub-maps for scaled l-values ls1,ls2, + ! with il less or equal ls2. l1,l2 are lengths of sub-sub-maps. + ! i1,i2 are indeces of first elements minus 1. + + l2 = map(i2+1) + if ( map(i2+2)<=il ) then + i1 = i2 + l1 = l2 + i2 = i2 + l2 + + ! if sub-sub-maps are empty, i. e. length less 4, than trara2=0 + + elseif ( (l1<4) .and. (l2<4) ) then + trara2 = 0.0_wp + return + else + + ! if flog2 less flog1, than ls2 first map and ls1 second map + + if ( map(i2+3)<=map(i1+3) ) exit + spag_nextblock_1 = 3 + cycle main + endif + enddo + spag_nextblock_1 = 2 + case (2) + kt = i1 + i1 = i2 + i2 = kt + kt = l1 + l1 = l2 + l2 = kt + spag_nextblock_1 = 3 + case (3) + + ! determine interpolate in scaled l-value + + fll1 = map(i1+2) + fll2 = map(i2+2) + dfl = (fnl-fll1)/(fll2-fll1) + flog1 = map(i1+3) + flog2 = map(i2+3) + fkb1 = 0.0_wp + fkb2 = 0.0_wp + if ( l1>=4 ) then + + ! b/b0 loop + + do j2 = 4 , l2 + fincr2 = map(i2+j2) + if ( fkb2+fincr2>fnb ) goto 10 + fkb2 = fkb2 + fincr2 + flog2 = flog2 - fistep + enddo + itime = itime + 1 + if ( itime==1 ) then + spag_nextblock_1 = 2 + cycle main + endif + trara2 = 0.0_wp + return + 10 if ( itime/=1 ) then + if ( j2==4 ) then + spag_nextblock_1 = 4 + cycle main + endif + sl2 = flog2/fkb2 + do j1 = 4 , l1 + fincr1 = map(i1+j1) + fkb1 = fkb1 + fincr1 + flog1 = flog1 - fistep + fkbj1 = ((flog1/fistep)*fincr1+fkb1)/((fincr1/fistep)*sl2+1.0_wp) + if ( fkbj1<=fkb1 ) goto 15 + enddo + if ( fkbj1<=fkb2 ) then + trara2 = 0.0_wp + return + endif + 15 if ( fkbj1<=fkb2 ) then + fkbm = fkbj1 + (fkb2-fkbj1)*dfl + flogm = fkbm*sl2 + flog2 = flog2 - fistep + fkb2 = fkb2 + fincr2 + sl1 = flog1/fkb1 + sl2 = flog2/fkb2 + spag_nextblock_1 = 5 + cycle main + else + fkb1 = 0.0_wp + endif + endif + fkb2 = 0.0_wp + endif + j2 = 4 + fincr2 = map(i2+j2) + flog2 = map(i2+3) + flog1 = map(i1+3) + spag_nextblock_1 = 4 + case (4) + flogm = flog1 + (flog2-flog1)*dfl + fkbm = 0.0_wp + fkb2 = fkb2 + fincr2 + flog2 = flog2 - fistep + sl2 = flog2/fkb2 + if ( l1<4 ) then + fincr1 = 0.0_wp + sl1 = -900000.0_wp + spag_nextblock_1 = 6 + cycle main + else + j1 = 4 + fincr1 = map(i1+j1) + fkb1 = fkb1 + fincr1 + flog1 = flog1 - fistep + sl1 = flog1/fkb1 + endif + spag_nextblock_1 = 5 + case (5) + do while ( sl1>=sl2 ) + fkbj2 = ((flog2/fistep)*fincr2+fkb2)/((fincr2/fistep)*sl1+1.0_wp) + fkb = fkb1 + (fkbj2-fkb1)*dfl + flog = fkb*sl1 + if ( fkb>=fnb ) then + spag_nextblock_1 = 7 + cycle main + endif + fkbm = fkb + flogm = flog + if ( j1>=l1 ) then + trara2 = 0.0_wp + return + else + j1 = j1 + 1 + fincr1 = map(i1+j1) + flog1 = flog1 - fistep + fkb1 = fkb1 + fincr1 + sl1 = flog1/fkb1 + endif + enddo + spag_nextblock_1 = 6 + case (6) + fkbj1 = ((flog1/fistep)*fincr1+fkb1)/((fincr1/fistep)*sl2+1.0_wp) + fkb = fkbj1 + (fkb2-fkbj1)*dfl + flog = fkb*sl2 + if ( fkb<fnb ) then + fkbm = fkb + flogm = flog + if ( j2>=l2 ) then + trara2 = 0.0_wp + return + else + j2 = j2 + 1 + fincr2 = map(i2+j2) + flog2 = flog2 - fistep + fkb2 = fkb2 + fincr2 + sl2 = flog2/fkb2 + spag_nextblock_1 = 5 + cycle main + endif + endif + spag_nextblock_1 = 7 + case (7) + if ( fkb<fkbm+1.0e-10_wp ) then + trara2 = 0.0_wp + else + trara2 = flogm + (flog-flogm)*((fnb-fkbm)/(fkb-fkbm)) + trara2 = max(trara2,0.0_wp) + return + endif + exit main + end select + enddo main + +end function trara2 + +end module trmfun_module +