I need many of my integers to be integer*8 in my port to 64 bit. In
C/C++ code, I can say 123456L to mean a long long value, generally 64
bit. Is there a corresponding way to do this in Fortran ...
I will have to put _8 in about 100,000 lines of
my F77 code.
On 10/2/2024 2:00 AM, Lawrence D'Oliveiro wrote:
On Tue, 1 Oct 2024 21:58:40 -0500, Lynn McGuire wrote:
I need many of my integers to be integer*8 in my port to 64 bit. In
C/C++ code, I can say 123456L to mean a long long value, generally 64
bit. Is there a corresponding way to do this in Fortran ...
integer(kind = 8), parameter :: bigval = 9223372036854775807_8
print *, bigval
prints
9223372036854775807
Thanks !
I was afraid of that. I will have to put _8 in about 100,000 lines of
my F77 code. And the future conversion to C++ will need special handling.
I need many of my integers to be integer*8 in my port to 64 bit. In
C/C++ code, I can say 123456L to mean a long long value, generally 64
bit. Is there a corresponding way to do this in Fortran or am I stuck
with:
call xyz (1)
subroutine xyz (ivalue)
integer*8 ivalue
...
return end
must be:
integer*8 ivalue
...
ivalue = 1
call xyz (ivalue)
Thanks,
Lynn
Lynn McGuire wrote:
I need many of my integers to be integer*8 in my port to 64 bit. In
C/C++ code, I can say 123456L to mean a long long value, generally 64
bit. Is there a corresponding way to do this in Fortran or am I stuck
with:
call xyz (1)
subroutine xyz (ivalue)
integer*8 ivalue
...
return end
must be:
integer*8 ivalue
...
ivalue = 1
call xyz (ivalue)
This is not actually a Fortran issue as such, it's all about a specific compiler (GNU Fortran).
On 10/2/2024 11:27 PM, Steven G. Kargl wrote:
On Wed, 02 Oct 2024 14:30:48 -0500, Lynn McGuire wrote:
On 10/2/2024 2:00 AM, Lawrence D'Oliveiro wrote:
On Tue, 1 Oct 2024 21:58:40 -0500, Lynn McGuire wrote:
I need many of my integers to be integer*8 in my port to 64 bit. In >>>>> C/C++ code, I can say 123456L to mean a long long value, generally 64 >>>>> bit. Is there a corresponding way to do this in Fortran ...
integer(kind = 8), parameter :: bigval = 9223372036854775807_8
print *, bigval
prints
9223372036854775807
Thanks !
I was afraid of that. I will have to put _8 in about 100,000 lines of
my F77 code. And the future conversion to C++ will need special handling. >>>
If you 100,000 lines of C++ without a trailing 'L', you would
need to add 'L' to get a long int. You also only need to add
'_8' (or 'L') to those values that would exceed huge(1) in
magnitude as integer*4 is a proper subset of integer*8 and
Fortran does conversion when required.
If Fortran does an automatic conversion from I*4 to I*8, why does the compiler gripe at me that the integer constant does not match the
subroutine argument type ?
On Thu, 03 Oct 2024 14:45:31 +0200, R Daneel Olivaw wrote:
Lynn McGuire wrote:
I need many of my integers to be integer*8 in my port to 64 bit. In
C/C++ code, I can say 123456L to mean a long long value, generally 64
bit. Is there a corresponding way to do this in Fortran or am I stuck
with:
call xyz (1)
subroutine xyz (ivalue)
integer*8 ivalue
...
return end
must be:
integer*8 ivalue
...
ivalue = 1
call xyz (ivalue)
This is not actually a Fortran issue as such, it's all about a specific
compiler (GNU Fortran).
If we overlook the nonstandard type in the declaration, and agree
that the compiler will accept 'integer*8', then the program is
still invalid Fortran. It's technically not a Fortran issue. It
is a programmer issue.
On 10/3/2024 10:02 AM, Steven G. Kargl wrote:
On Thu, 03 Oct 2024 02:06:28 -0500, Lynn McGuire wrote:
On 10/2/2024 11:27 PM, Steven G. Kargl wrote:As the person who gave gfortran the -fdefault-integer-8 option, I hope
your XXX kloc of code uses neither equivalence nor common blocks.
I have 197 common blocks included from dedicated files and a massive
number of equivalences all over the place. Several of the equivalences
are actually in the common block files. The equivalences have made the eventual C++ conversion of the Fortran code tricky.
This code is 850,000 lines of F77 code and 50,000 lines of C++ code that dates back to 1965 or so. Half of the code is Fortran IV and half is
F77. It has been ported to 12 ? different platforms, mostly mainframes
in the 1960s, 1970s, 1980s, and 1990s.
My code used to assign Hollerith to Real numbers but I ripped that out
years ago in a project to get rid of Hollerith.
My personal recommendation would be to do a proper porting from
integer (aka integer*4) to integer(kind=8). And, yes, 8 in the
'kind=8' is not portable.
I have 197 common blocks included from dedicated files and a massive
number of equivalences all over the place.
On 03/10/2024 20:59, Steven G. Kargl wrote:different purposes: at least one uses kinds 1, 2, 3, 4 for the four most
My personal recommendation would be to do a proper porting from
integer (aka integer*4) to integer(kind=8). And, yes, 8 in the
'kind=8' is not portable.
Yes because different compilers use different integer kind numbers for
On 10/3/2024 5:08 PM, Lawrence D'Oliveiro wrote:
On Thu, 3 Oct 2024 14:32:28 -0500, Lynn McGuire wrote:
I have 197 common blocks included from dedicated files and a massive
number of equivalences all over the place.
Try getting rid of at least some of them, by using “contains”.
What does "contains" do ? My knowledge of Fortran stopped at F77+.
I started writing Fortran IV in 1975. Been down a lot of roads since
then. I've written software in Fortran IV and 77, Pascal, C, C++, Curl,
etc. They are all running together now, I am getting old.
On Thu, 3 Oct 2024 14:34:01 -0500, Lynn McGuire wrote:
My code used to assign Hollerith to Real numbers but I ripped that out
years ago in a project to get rid of Hollerith.
Fortran was the first programming language I learned (from the Anna Burke Harris book). The only kind of string literals I can remember in that
first learning were Hollerith literals. I liked the fact that they were unambiguous: because length was explicit up front, you could any
characters you liked in them.
Later I discovered that “normal” people preferred explicitly-delimited string literals.
but not as friendly as
character*28 txthdr /'Text header, with a comma ' /
On Fri, 4 Oct 2024 12:13:52 +0200, R Daneel Olivaw wrote:
but not as friendly as
character*28 txthdr /'Text header, with a comma ' /
With all these additions to Fortran, I keep wondering “when will they finish reinventing PL/I?”. Because at an early point in the development
of PL/I, they were going to call it “FORTRAN VI”.
One PL/I feature still missing from Fortran is VARYING strings.
On Fri, 4 Oct 2024 12:13:52 +0200, R Daneel Olivaw wrote:
but not as friendly as
character*28 txthdr /'Text header, with a comma ' /
With all these additions to Fortran, I keep wondering “when will they finish reinventing PL/I?”. Because at an early point in the development of PL/I, they were going to call it “FORTRAN VI”.
One PL/I feature still missing from Fortran is VARYING strings.
Yup, Perl, not Curl. AutoLisp.
Yes, I am porting from Open Watcom C++ and F77 to Simply Fortran C++ and GFortran right now. Lots of new stuff that I won't use. Incredibly
better error detection, especially on variable types and bounds.
On Fri, 04 Oct 2024 20:04:05 +0000, Lawrence D'Oliveiro wrote:
On Fri, 4 Oct 2024 12:13:52 +0200, R Daneel Olivaw wrote:
but not as friendly as
character*28 txthdr /'Text header, with a comma ' /
With all these additions to Fortran, I keep wondering “when will they
finish reinventing PL/I?”. Because at an early point in the development
of PL/I, they were going to call it “FORTRAN VI”.
One PL/I feature still missing from Fortran is VARYING strings.
The above line of code in not standard conforming Fortran.
On 10/4/2024 3:04 PM, Lawrence D'Oliveiro wrote:
On Fri, 4 Oct 2024 12:13:52 +0200, R Daneel Olivaw wrote:
but not as friendly as
character*28 txthdr /'Text header, with a comma ' /
With all these additions to Fortran, I keep wondering “when will they
finish reinventing PL/I?”. Because at an early point in the development of >> PL/I, they were going to call it “FORTRAN VI”.
One PL/I feature still missing from Fortran is VARYING strings.
Fortran does have a form of varying string...just not super convenient to use in the general case.
Steven G. Kargl wrote:
On Fri, 04 Oct 2024 20:04:05 +0000, Lawrence D'Oliveiro wrote:
On Fri, 4 Oct 2024 12:13:52 +0200, R Daneel Olivaw wrote:
but not as friendly as
character*28 txthdr /'Text header, with a comma ' /
With all these additions to Fortran, I keep wondering “when will they
finish reinventing PL/I?”. Because at an early point in the development >>> of PL/I, they were going to call it “FORTRAN VI”.
One PL/I feature still missing from Fortran is VARYING strings.
The above line of code in not standard conforming Fortran.
I have not fed it through the compiler I used to use (mainframe, and I
no longer have access) but that compiler conformed to Fortran77 to the
extent they did not even offer integer*8.
They did have some local extensions (statement functions) but they were clearly marked as non-standard in the manuals.
On 04/10/2024 21:36, Gary Scott wrote:
On 10/4/2024 3:04 PM, Lawrence D'Oliveiro wrote:
On Fri, 4 Oct 2024 12:13:52 +0200, R Daneel Olivaw wrote:
but not as friendly as
character*28 txthdr /'Text header, with a comma ' /
With all these additions to Fortran, I keep wondering “when will they
finish reinventing PL/I?”. Because at an early point in the
development of
PL/I, they were going to call it “FORTRAN VI”.
One PL/I feature still missing from Fortran is VARYING strings.
Fortran does have a form of varying string...just not super convenient
to use in the general case.
Yes but for practical purposes it only works for scalars, not arrays.
Since nearly all the rest of Fortran is based on the (unstated, but widely-understood) principle that arrays are first-class objects, this
is a real pity.
I really liked the flexibility of string/text processing of IBM's DCF/Script/GML. How that was powerful string handling.
On Sat, 5 Oct 2024 13:52:01 -0500, Gary Scott wrote:
I really liked the flexibility of string/text processing of IBM's
DCF/Script/GML. How that was powerful string handling.
As good as Perl?
On 10/5/2024 6:07 PM, Lawrence D'Oliveiro wrote:
On Sat, 5 Oct 2024 13:52:01 -0500, Gary Scott wrote:
I really liked the flexibility of string/text processing of IBM's
DCF/Script/GML. How that was powerful string handling.
As good as Perl?
vastly better, but it was specifically a text (document) processor,
vastly different purpose.
On Sat, 5 Oct 2024 19:39:31 -0500, Gary Scott wrote:Extremely powerful substitution, full control of fonts, code points,
On 10/5/2024 6:07 PM, Lawrence D'Oliveiro wrote:
On Sat, 5 Oct 2024 13:52:01 -0500, Gary Scott wrote:
I really liked the flexibility of string/text processing of IBM's
DCF/Script/GML. How that was powerful string handling.
As good as Perl?
vastly better, but it was specifically a text (document) processor,
vastly different purpose.
How could it have been better without regular expressions?
On 10/5/2024 8:58 PM, Lawrence D'Oliveiro wrote:
How could it have been better without regular expressions?
Extremely powerful substitution ...
full control of fonts, code points, code pages, dynamically controlled overprinting, image handling ...
direct/binary datastream writing/editing, formatting page columns,
gutters, running headings/footings, tables, lists (order, unordered,
etc.) ...
... full support for foreign languages, double byte character sets
decades before unicode ...
Directly define your own gml (predecessor to html) tags.
On Sat, 5 Oct 2024 21:35:42 -0500, Gary Scott wrote:
On 10/5/2024 8:58 PM, Lawrence D'Oliveiro wrote:
How could it have been better without regular expressions?
Extremely powerful substitution ...
But without regular expressions, that kind of thing gets quite limited.
full control of fonts, code points, code pages, dynamically controlled
overprinting, image handling ...
troff was doing this sort of thing years before. Remember that the Unix
folks at Bell Labs got the funding to develop their new OS primarily on
the rationale that it would offer good text-processing facilities, like
you describe.
direct/binary datastream writing/editing, formatting page columns,
gutters, running headings/footings, tables, lists (order, unordered,
etc.) ...
I notice no mention of line-numbering. That’s rather crucial for legal documents -- another selling point that the Bell Labs folks were able to address.
... full support for foreign languages, double byte character sets
decades before unicode ...
I don’t know why you think that was such a radical feature, given that the Koreans introduced their national double-byte code in 1974, the Japanese theirs in 1978, and the Chinese did GB2312 in 1980.
Directly define your own gml (predecessor to html) tags.
troff incorporated the idea of macros right from the beginning.
On 10/5/2024 10:39 PM, Lawrence D'Oliveiro wrote:And yes it supported line numbers and change markups.
On Sat, 5 Oct 2024 21:35:42 -0500, Gary Scott wrote:
On 10/5/2024 8:58 PM, Lawrence D'Oliveiro wrote:
How could it have been better without regular expressions?
Extremely powerful substitution ...
But without regular expressions, that kind of thing gets quite limited.
full control of fonts, code points, code pages, dynamically controlled
overprinting, image handling ...
troff was doing this sort of thing years before. Remember that the Unix
folks at Bell Labs got the funding to develop their new OS primarily on
the rationale that it would offer good text-processing facilities, like
you describe.
direct/binary datastream writing/editing, formatting page columns,
gutters, running headings/footings, tables, lists (order, unordered,
etc.) ...
I notice no mention of line-numbering. That’s rather crucial for legal
documents -- another selling point that the Bell Labs folks were able to
address.
... full support for foreign languages, double byte character sets
decades before unicode ...
I don’t know why you think that was such a radical feature, given that
the
Koreans introduced their national double-byte code in 1974, the Japanese
theirs in 1978, and the Chinese did GB2312 in 1980.
Directly define your own gml (predecessor to html) tags.
troff incorporated the idea of macros right from the beginning.
This stuff was done in the 60s and 70s, certainly it evolved over time.
I have 197 common blocks included from dedicated files and a massive
number of equivalences all over the place. Several of the equivalences
are actually in the common block files. The equivalences have made the eventual C++ conversion of the Fortran code tricky.
Lynn McGuire <lynnmcguire5@gmail.com> schrieb:
I have 197 common blocks included from dedicated files and a massive
number of equivalences all over the place. Several of the equivalences
are actually in the common block files. The equivalences have made the
eventual C++ conversion of the Fortran code tricky.
What do you use the equivalences for? Saving memory? Then this
should not be a large issue on modern machines.
If you are using them for tricks with type conversion, then you
are on thin ice already, and have been since Fortran 66.
And if you have a few big arrays, then changing those to ALLOCATABLE
and allocating them at runtime might well be straightforward.
Lynn McGuire <lynnmcguire5@gmail.com> schrieb:
I have 197 common blocks included from dedicated files and a massive
number of equivalences all over the place. Several of the equivalences
are actually in the common block files. The equivalences have made the
eventual C++ conversion of the Fortran code tricky.
What do you use the equivalences for? Saving memory? Then this
should not be a large issue on modern machines.
If you are using them for tricks with type conversion, then you
are on thin ice already, and have been since Fortran 66.
And if you have a few big arrays, then changing those to ALLOCATABLE
and allocating them at runtime might well be straightforward.
Equivalences are an effective way of building data structures, you can
do that with Common as well but sometimes equivalence is more suitable.
R Daneel Olivaw <Danny@hyperspace.vogon.gov> schrieb:
Equivalences are an effective way of building data structures, you can
do that with Common as well but sometimes equivalence is more suitable.
Can you give an example? I have a hard time imagining what it would
be useful for.
On 10/13/2024 7:18 AM, Thomas Koenig wrote:
What do you use the equivalences for?
About the only thing I've used it for is for performing mathematical operations on things like characters for encryption or compression algorithms. Using a function for that doesn't appeal to me.
integer record (100), reckey, reccod
c or integer*4
character*40 recnam, recstr, rectwn
c
equivalence (record, reckey), (record (2), recnam)
equivalence (record (12), recstr), (record (22), rectwn)
equivalence (record (32), reccod)
c and so on
"DYNOSOR: a set of subroutines for dynamic memory organization in
Fortran programs"
https://dl.acm.org/doi/10.1145/954654.954661
One of our guys went to an ACM conference in 1977 and came back with
this paper. It was the answer to our memory problems on the Univac
1108, the CDC 7600, and later the IBM 370.
I converted the memory allocation scheme from a common block in 1992 ???
to using the C malloc, realloc, and free library functions. Worked like
a champ on Unix, Vax VMS, IBM mainframes, and PC DOS using various F77 compilers.
Lynn McGuire <lynnmcguire5@gmail.com> schrieb:
"DYNOSOR: a set of subroutines for dynamic memory organization in
Fortran programs"
https://dl.acm.org/doi/10.1145/954654.954661
One of our guys went to an ACM conference in 1977 and came back with
this paper. It was the answer to our memory problems on the Univac
1108, the CDC 7600, and later the IBM 370.
Only the first page is readable, the rest is behind paywall,
unfortunately.
I converted the memory allocation scheme from a common block in 1992 ???
to using the C malloc, realloc, and free library functions. Worked like
a champ on Unix, Vax VMS, IBM mainframes, and PC DOS using various F77
compilers.
If you're already using dynamic allocation, then you can of course
keep on doing what you are doing. It will not be officially
supported, but the likelyhood of this continuing to work is high
(no guarantees, though).
Lynn McGuire<lynnmcguire5@gmail.com> schrieb:
"DYNOSOR: a set of subroutines for dynamic memory organization inOnly the first page is readable, the rest is behind paywall,
Fortran programs"
https://dl.acm.org/doi/10.1145/954654.954661
One of our guys went to an ACM conference in 1977 and came back with
this paper. It was the answer to our memory problems on the Univac
1108, the CDC 7600, and later the IBM 370.
unfortunately.
I am thinking that 32 bit and 64 bit are here to stay for quite a while.
I never would
have guessed that 47 years later, FORTRAN would be Fortran and ALGOL
would be mostly forgotten.)
On Tue, 15 Oct 2024 02:43:47 -0600, Louis Krupp wrote:
I never wouldWhat irks me most is the prevalence of “=” over “:=” for assignment.
have guessed that 47 years later, FORTRAN would be Fortran and ALGOL
would be mostly forgotten.)
But, looking at language specs for Fortran-90 and later, would you still
say “FORTRAN is Fortran”?
FORTRAN was my first (computer) language.
the B5500 was replaced by a B6700, which used EBCDIC, ALGOL used ":="
instead of the arrow, which I missed.
The guys at NIST are talking about quadruple precision as a standard.
type :: record_type
integer(kind = intsize) reckey
character(len = strmax) :: recnam, recstr, recwn
integer(kind = intsize) reccod
! and so on
end type record_type
On 10/5/2024 1:39 AM, Lawrence D'Oliveiro wrote:
If I were you, I would look for opportunities to simplify things in
that Fortran code by using new features, where I have to make major
modifications to those parts anyway.
All of the modifications that I am making are minor. Mostly changing my
old 8 byte data structure/union to I*8 and L*8.
I include all of my common blocks as files to stop typos.
Here is one of my 197 common block include files, global.inc:
C global.inc
C
C
C 11/21/19 Lynn McGuire pmr 6299, add new ncp max used variable for chemtran
...
integer MAX_NCP
PARAMETER (MAX_NCP = 1000)
COMMON / GLOBAL / KTRACE, NCP, SETSTP, NDYNER, NERQQQ, LNOLIMIT,
* do_not_call_pivf, do_not_call_adbf,
* ne_did_not_converge, equipment_fail_count,
* lrespect_user_pitch, do_not_call_threephs,
* do_not_call_flai, do_not_call_liqh,
* do_not_call_vaph, thermo_init_failed,
* num_crude_streams, print_streams_for_each_unit,
* do_not_call_solid_isothermal_flash,
* ncp_max_used
integer KTRACE
integer NCP
logical SETSTP
integer NDYNER
integer NERQQQ
integer num_crude_streams
logical LNOLIMIT
logical do_not_call_pivf
logical do_not_call_adbf
logical lrespect_user_pitch
logical do_not_call_threephs
logical do_not_call_flai
logical do_not_call_liqh
logical do_not_call_vaph
logical thermo_init_failed
logical print_streams_for_each_unit
logical do_not_call_solid_isothermal_flash
C this is to record the ncp max used for chemtran since itchanges ncp on the fly
integer ncp_max_used
I have "implicit none" in my first mandatory include for all 5,000+ subroutine files.
BTW, my software dates before version control systems.
And I like change notes in my code, it helps to figure out what
is going on.
And some day we are going to change version control systems again.
And I am not going to upgrade 850,000 lines of Fortran F77 code to F90
code just to have prettier code. I would still be here in 10 years
fixing all of the bugs from that disaster.
I am going to change all the F77 code to C++ some day.
I am going to change all the F77 code to C++ some day. I already have a heavily modified version of F2C that I have rewritten extensively and
already moved several hundred subroutines from F77 to C++.
The biggest
problem is the F77 write statements.
F2C fixes the other big problem
automatically, the change of initial array index from one to zero.
{
if (t <= component_data1.triplepointtemperature[k - 1]) {
solid_vapor_pressure (k, t, ps);
*star = ' ';
goto L99999;
}
L99999:
if (*ps < 1e-20) {
*ps = 1e-20;
}
if (*ps > 1e6) {
*ps = 1e6;
}
return 0;
} /* vapres */
On 10/24/2024 1:28 AM, Thomas Koenig wrote:
Lynn McGuire <lynnmcguire5@gmail.com> schrieb:
F2C fixes the other big problem
automatically, the change of initial array index from one to zero.
If I remember correctly, it does so by issueing invalid C (or
C++), by using negative offsets from pointers. Might work now,
might not work tomorrow.
But note the IIRC above.
I want to move to a monolanguage environment. 50,000 lines of my
calculation engine are C++ already. 850,000 lines to go.
The "parameter adjustment" above is explicitly listed as undefined
behavior, in annex J2 of n2596.pdf (for example):
"Addition or subtraction of a pointer into, or just beyond, an array
object and an integer type produces a result that does not point into,
or just beyond, the same array object (6.5.6)."
On Sat, 26 Oct 2024 11:51:42 -0000 (UTC), Thomas Koenig wrote:
The "parameter adjustment" above is explicitly listed as undefined
behavior, in annex J2 of n2596.pdf (for example):
"Addition or subtraction of a pointer into, or just beyond, an array
object and an integer type produces a result that does not point into,
or just beyond, the same array object (6.5.6)."
Read it again: note the qualification “that does not point into, or just beyond, the same array object”. So long as it *does* point “into, or just beyond, the same array object”, it is fine.
First, I include all of my 300+ common blocks as 200 files. I converted those separately and cleaned them up so that the static variables and
defines are easy to peruse and understand. I delete all of the local
common block conversions by f2c in the subroutines and change them back
to include files. An easy cleanup that I have to do 5,000 times (4,000
to go now plus the 100+ subroutines that we have modified for customers
since I started the conversion project two years ago).
I also removed the parameter adjustments from my copy of f2c. It is a
little tricky but as you say, they are not legal code in C++.
Lawrence D'Oliveiro <ldo@nz.invalid> schrieb:
On Sat, 26 Oct 2024 11:51:42 -0000 (UTC), Thomas Koenig wrote:
The "parameter adjustment" above is explicitly listed as undefined
behavior, in annex J2 of n2596.pdf (for example):
"Addition or subtraction of a pointer into, or just beyond, an array
object and an integer type produces a result that does not point into,
or just beyond, the same array object (6.5.6)."
Read it again: note the qualification “that does not point into, or
just beyond, the same array object”. So long as it *does* point “into, >> or just beyond, the same array object”, it is fine.
What you are writing is equivalent to
On Sat, 26 Oct 2024 21:38:38 -0000 (UTC), Thomas Koenig wrote:
Lawrence D'Oliveiro <ldo@nz.invalid> schrieb:
On Sat, 26 Oct 2024 11:51:42 -0000 (UTC), Thomas Koenig wrote:
The "parameter adjustment" above is explicitly listed as undefined
behavior, in annex J2 of n2596.pdf (for example):
"Addition or subtraction of a pointer into, or just beyond, an array
object and an integer type produces a result that does not point into, >>>> or just beyond, the same array object (6.5.6)."
Read it again: note the qualification “that does not point into, or
just beyond, the same array object”. So long as it *does* point “into, >>> or just beyond, the same array object”, it is fine.
What you are writing is equivalent to
You don’t understand what pointer arithmetic means, do you?
I've killfiled you in comp.arch, and I think it is a good time now
for comp.lang.fortran.
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 493 |
Nodes: | 16 (0 / 16) |
Uptime: | 165:53:09 |
Calls: | 9,703 |
Calls today: | 3 |
Files: | 13,733 |
Messages: | 6,177,979 |